存储过程结果集与返回值

时间:2014-10-31 21:35:51

标签: sql-server tsql stored-procedures

我甚至不确定我是否可以充分描述这一点,但从这开始:我有一个处理获取大量数据的存储过程,并且我同时将其设置为执行以下操作:

  • 获取最高批次#作为变量
  • 使用该批次#
  • 更新所有未处理的记录
  • 选择所有这些记录
  • 将其标记为已处理

(代码如下所示)

此存储过程由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;

1 个答案:

答案 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.这个返回值的捕获和使用方式取决于应用程序。)