gpt4 book ai didi

tsql - 如何从 CTE 调用带参数的存储过程(无光标)

转载 作者:行者123 更新时间:2023-12-05 05:22:37 25 4
gpt4 key购买 nike

我有一个返回结果的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com