我有一个返回结果的 CTE,我想从 CTE 的结果调用一个存储过程。像这样:
;WITH MyCTE AS
(
SELECT arg1, arg2, arg3 FROM ATable
)
EXEC dbo.A_StoredProcedure
SELECT arg1 FROM MyCTE,
SELECT arg2 FROM MyCTE,
SELECT arg3 FROM MyCTE
这当然行不通,因为 EXEC 不是直接在 CTE 之后允许的命令。我知道我可以使用 CURSOR 来导航和调用我的存储过程,但是由于游标是“邪恶的”;P ;P ;P ;P ;P 我想知道:有没有办法从 CTE 结果调用我的存储过程而不需要光标?
如果cursor是不可避免的,我怎么用cursor呢?
注意:如果可能的话,我希望不要将存储过程的内容复制到 CTE 中以简化代码维护。
最佳答案
我继续搜索并找到了一些可能有效的答案,但请随时发表评论并添加其他可能的答案。
答案 1: 感谢这篇文章:Execute stored procedure programmatically inside recursive CTE instead of Cursor
可以使用临时表,像这样:
DECLARE #TempEmp TABLE
(
arg1 INT IDENTITY,
arg2 INT,
arg3 INT
)
INSERT INTO #TempTable
(
arg1, arg2, arg3
)
SELECT arg1, arg2, arg3 FROM ATable
DECLARE @arg1 INT
DECLARE @arg2 INT
DECLARE @arg3 INT
WHILE EXISTS (SELECT 1 FROM #TempTable)
BEGIN
SELECT TOP 1 @arg1 = arg1, @arg2 = arg2, @arg3 = arg3 FROM #TempTable
EXEC dbo.A_StoredProcedure @arg1, @arg2, @arg3
DELETE FROM #TempTable WHERE arg1 = @arg1
END
答案 2: 感谢您的回答:Cursor with Stored Procedure Question .
如果使用游标,它可能看起来像这样:
DECLARE @arg1 INT
DECLARE @arg2 INT
DECLARE @arg3 INT
DECLARE cur CURSOR READ_ONLY
FOR
SELECT arg1, arg2, arg3 FROM ATable
OPEN cur
FETCH NEXT FROM cur
INTO @arg1, @arg2, @arg3
-- Boucle dans le résultat
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.A_StoredProcedure @arg1, @arg2, @arg3
FETCH NEXT FROM cur
INTO @arg1, @arg2, @arg3
END
CLOSE cur
DEALLOCATE cur
有没有人有其他想法?
关于tsql - 如何从 CTE 调用带参数的存储过程(无光标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923954/