2014-10-31 53 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