2013-06-03 24 views
2

我有一個包含2列的臨時表。動態地將xml傳遞給存儲過程

CREATE TABLE #ExecuteThese 
    (
     StoredProcedure nvarchar(200), 
     Parameter xml 
    ) 

我所試圖做的是在遊標執行所有的存儲過程在此臨時表和XML參數傳遞給它,同時還捕捉過程的返回值。

我在正確的軌道上嗎? @parameters@storedProc是遊標變量

-- Capture the return level code 
DECLARE @returnLevel int 
exec sp_executesql @storedProc, N'@parameters xml', @parameters, N'@returnLevel int output', @returnLevel output 

任何幫助將不勝感激。

謝謝!

回答

1

您可以在標識列使用循環和動態執行語句

IF OBJECT_ID(N'dbo.XmlProc', N'P') IS NOT NULL DROP PROC dbo.XmlProc 
GO 
CREATE PROC dbo.XmlProc 
@xmlParam xml, 
@paramOUT int OUTPUT 
AS 
SELECT @paramOUT = @XmlParam.value('/param[1]', 'nvarchar(1)') 
GO 

IF OBJECT_ID(N'dbo.XmlProc2', N'P') IS NOT NULL DROP PROC dbo.XmlProc2 
GO 
CREATE PROC dbo.XmlProc2 
@xmlParam xml, 
@paramOUT int OUTPUT 
AS 
SELECT @paramOUT = @XmlParam.value('/param[1]', 'nvarchar(1)') 
GO 

IF OBJECT_ID(N'dbo.XmlProc3', N'P') IS NOT NULL DROP PROC dbo.XmlProc3 
GO 
CREATE PROC dbo.XmlProc3 
@xmlParam xml, 
@paramOUT int OUTPUT 
AS 
SELECT @paramOUT = @XmlParam.value('/param[1]', 'nvarchar(1)') 
GO 

IF OBJECT_ID(N'tempdb.dbo.#ExecuteThese') IS NOT NULL DROP TABLE dbo.#ExecuteThese 
CREATE TABLE dbo.#ExecuteThese 
(
    Id int IDENTITY, 
    StoredProcedure nvarchar(100), 
    Parameter xml 
) 

INSERT dbo.#ExecuteThese 
VALUES('dbo.XmlProc @param, @paramOUT OUTPUT', '<param>1</param>'), 
     ('dbo.XmlProc2 @param, @paramOUT OUTPUT', '<param>2</param>'), 
     ('dbo.XmlProc3 @param, @paramOUT OUTPUT', '<param>3</param>') 

DECLARE @id int = 1,   
     @param xml, 
     @parmRET int, 
     @dml nvarchar(max) 
WHILE (@id IS NOT NULL) 
BEGIN  
    SELECT @dml = StoredProcedure, @param = Parameter 
    FROM dbo.#ExecuteThese 
    WHERE Id = @Id 

    EXEC sp_executesql @dml, N'@param xml, @paramOUT int OUTPUT', @param, @parmRET OUTPUT 
    SELECT @parmRET AS parmRET 

    SELECT @id = MIN(Id) FROM dbo.#ExecuteThese WHERE Id > @Id 
END 
相關問題