我有一个有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
非常感谢任何帮助。
谢谢!
答案 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