我甚至不确定我是否可以充分描述这一点,但从这开始:我有一个处理获取大量数据的存储过程,并且我同时将其设置为执行以下操作:
(代码如下所示)
此存储过程由GoAnywhere(一种数据传输工具)执行。 GoAnywhere正在执行查询,并且甚至显示它正在检索正确的记录集,但是在它应该使用select语句中的结果集来更新目标数据库时正在轰炸。它得到的错误是它无法将整数转换为行集。
我已经发现,在SQL Server中,除了结果集之外,存储过程总是返回1或0作为返回值。出于某种原因,GoAnywhere似乎正在挑选它而不是SQL语句的结果。
我已经确定如果我注释掉下面代码示例中注释掉的代码行,GoAnywhere会选择结果集并很好地处理它。
我的问题:有没有办法修改这个存储过程,以便默认返回值是结果集而不是1或0,而不是将其分解为多个存储过程调用?
备选问题:如果我真的很幸运并且有GoAnywhere专家查看此内容,我会对如何让GoAnywhere忽略返回值并按原样接受结果集感到高兴。
存储过程代码:
USE [myDB]
GO
/****** Object: StoredProcedure [dbo].[myProcedure] Script Date: 10/31/2014 13:42:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE myProcedure
AS
DECLARE @BatchId int;
DECLARE @BatchDate datetime;
SET @BatchId = (select IsNull(Max(ProcessBatchID), 0) + 1 FROM myTable)
set @BatchDate = GetDate();
-- UPDATE myTable SET ProcessBatchID = @BatchId, ProcessedDateTime = @BatchDate, ProcessingStatus = 'Processing' WHERE ProcessBatchID IS NULL;
SELECT
FullCardNumber, CustomerMarsNumber, CustomerLevelId,
CustomerLevelName, ProcessBatchID
FROM
myTable
WHERE
ProcessBatchID = @BatchId;
-- UPDATE myTable SET ProcessingStatus = 'Processed' WHERE ProcessBatchID = @BatchId;
答案 0 :(得分:3)
我不知道GoAnywhere,这是一个很长的镜头,但尝试添加
SET NOCOUNT on
在AS
声明之后立即到您的程序。 SQL将为每次查询运行返回一个rowcount,并且返回的信息可能会使应用程序混乱。 (关于如何返回信息,我一直都不清楚......)
猜测一个数字并忽略SELECT
语句返回的数据集,调用过程的输出可能如下所示:
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
(顺便说一句,对SQL存储过程的调用返回RETURN
语句定义的整数值,默认值为0.这个返回值的捕获和使用方式取决于应用程序。)