动态地将xml传递给存储过程

时间:2013-06-03 20:33:35

标签: sql xml sql-server-2008 stored-procedures

我有一个有2列的临时表。

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 个答案:

答案 0 :(得分: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