Sql-Server

從連結伺服器執行另一個儲存過程中的儲存過程

  • October 21, 2019

我有一個問題,我不知道如何解決它,我在網上搜尋並找到了很好的建議,但我無法解決。

這就是問題所在:我的 PC 上執行了一個 SQL Server 實例,並且我將其中一個主伺服器連結SRVOLD\SQLDESA到它。我想從我的 PC 的 SQL Server 實例中執行主伺服器的儲存過程,並將結果插入到一個新表中。我找到了使用以下方法的完美方法:

SELECT *   
INTO Bank   
FROM OPENQUERY([SRVOLD\SQLDESA],  
              'EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')   
GO  

有關於此伺服器的重要資訊,它的 SQL Server 版本是 2008。記住這一點以備後用。

好的,所以我設法執行了這個儲存過程,但我發現了一些東西,原來在這個儲存過程中有另一個儲存過程的執行,檢查一下:

第一個儲存過程:

CREATE PROCEDURE Bank.usp_GetTDcodes 
   (@code TINYINT = NULL, @qty TINYINT = NULL)
WITH ENCRYPTION 
AS
   DECLARE @@msg VARCHAR(100)
   DECLARE @@OK INT
   DECLARE @@today CHAR(30)

   SELECT @@today = CONVERT(VARCHAR(30), GETDATE(), 112) + ' ' +
                    CONVERT(VARCHAR(30), GETDATE(), 8)

   SELECT bnk_code, bnk_descr
   FROM CODBNK
   WHERE bnk_code < 50

   EXECUTE @@OK = Bank.usp_WriteEvent  @qty, @code, @@today, 500

   IF @@OK <> 0
       RETURN @@OK

RETURN 0
GO

現在讓我們看一下第二個儲存過程:

CREATE PROCEDURE Bank.usp_WriteEvent
   (@code TINYINT = NULL, 
    @qty TINYINT = NULL,   
    @date DATETIME = NULL,     
    @number SMALLINT = NULL, 
    @ideve INT = 0 OUTPUT)
WITH ENCRYPTION
AS
   DECLARE @@sdate VARCHAR(30)
   DECLARE @@ret SMALLINT

   INSERT INTO Event (eve_code, eve_qty, eve_date, eve_number)
   VALUES (@code, @qty, @date, @number)

   SET @@ret = @@error

   IF @@ret = 0
   BEGIN
       SELECT @ideve = @@IDENTITY

       SELECT @@sdate = CONVERT(VARCHAR(30), @date, 112) +  ' ' +
                        VARCHAR(30), @date, 8) 
   END
   ELSE 
       RETURN @@ret
GO

當我執行第一個儲存過程時,我能夠將它的結果插入到一個新表中,但我希望找到一個插入到表中的新行Event,因為這是執行第二個儲存過程時的預期結果。

所以我開始在網上搜尋並通過執行以下操作來實現這一目標:

SELECT *   
INTO Bank   
FROM OPENQUERY([SRVTEST\SQLDESA],  
              'SET FMTONLY OFF;SET NOCOUNT ON;EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')   
GO  

所以,SET FMTONLY OFF;SET NOCOUNT ON工作,我很高興。但是發生了一些事情…

我需要執行相同的儲存過程,但這次添加了一個新的連結伺服器SRVNEW\SQLDESA。此伺服器的版本是 2012,因此新的解決方案不起作用。我一直在嘗試不同的方法,只有一種方法可以使它工作,如下:

EXEC [SRVNEW\SQLDESA].[Bank_Database].Bank.usp_GetTDcodes 1,5

但這對我不起作用,因為我需要將第一個儲存過程結果放入一個新表中。而且我不知道它的架構,這就是為什麼SELECT INTO最適合我的原因。我不知道我還能做什麼,也許OPENQUERY那不起作用?我需要更改其他內容嗎?

PD:我也試過用OPENROWSET沒用。

在此先感謝,祝您有美好的一天!和平!

一些參考資料: http: //www.sommarskog.se/share_data.html#OPENQUERY

我使用了@Scott Hodgin 建議的函式並使用該資訊創建了表格。謝啦!

注意:如果您的儲存過程正在使用臨時表,這將無法按照頁面中的指定工作:

無法確定結果,因為批處理包含臨時表並且 sp_describe_first_result_set 不支持。

引用自:https://dba.stackexchange.com/questions/251292