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

标签 tsql stored-procedures

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

相关文章:

sql - 显示已删除的行 T-SQL

sql - 返回连续日期的临时表

stored-procedures - 如何在 LotusScript 中接收 DB2 存储过程结果

c# - 对存储过程的结果进行排序

sql - Access 将行连接成单行 : extra conditions needed

tsql - 在删除触发器中更新表以删除多行

sql - 删除具有相同字段值的连续行

java - 无法从 Java 中的 StoredProc 获取结果集

c# - 使用 2 个存储过程更新现有记录并仅插入 Datagridview 的新记录

sql - 我如何将这两者结合在一起? Varchar guid 和 guid 类型都是主键