2014-10-31 56 views
1

我甚至不确定我是否可以充分描述这一点,但从此开始:我有一个存储过程,可以处理获取大量数据,并且同时设置它做到以下几点:存储过程结果集与返回值

  • 获得最高批号为变量
  • 更新所有未处理的记录,与该批次#
  • 选择所有这些记录
  • 将其标记为处理

(代码将在下面显示)

该存储过程由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; 
+2

'SET NOCOUNT ON;'在程序的顶部。 – 2014-10-31 21:44:05

+1

@Cory - 谢谢!我希望你作为答案发布,以便我可以投票并接受它,因为你是第一个发布正确的解决方案。但是谢谢你的帮助! – David 2014-10-31 21:59:04

回答

3

我不知道GoAnywhere,这是一个长镜头,但尝试添加

SET NOCOUNT on 

到你的过程中,AS声明之后。 SQL将为每个查询运行返回一个行计数,并且返回的信息可能会使应用程序混淆。 (我从来没有上多么返回的信息是明确的......)

猜测数量,而忽略由SELECT语句返回的数据集,从你的过程调用的输出可能看起来像:

(1 row(s) affected) 

(1 row(s) affected) 

(1 row(s) affected) 

(由此,对SQL存储过程的调用返回RETURN语句定义的整数值,默认值为0.该捕获和使用返回值的方式取决于应用程序。)

+0

完美!谢谢。 – David 2014-10-31 21:57:50