2

我有一个有 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

任何帮助将不胜感激。

谢谢!

4

1 回答 1

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
于 2013-06-03T22:29:41.503 回答