我有一个返回结果的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来导航和调用我的存储过程,但是因为游标是" evil" ; P; P; P; P; P我想知道:有没有办法从没有光标的CTE结果调用我的存储过程?
如果光标不可避免,我怎么能用光标做到?
注意:我希望尽可能不将我的存储过程的内容复制到CTE中以简化代码维护。
答案 0 :(得分:1)
我继续搜索,我找到了一些可能有效的答案,但请随时发表评论并添加其他可能的答案。
答案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
有没有人有其他想法?