如何使用CTE中的参数调用存储过程(无光标)

时间:2016-10-07 18:45:26

标签: 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来导航和调用我的存储过程,但是因为游标是" evil" ; P; P; P; P; P我想知道:有没有办法从没有光标的CTE结果调用我的存储过程?

如果光标不可避免,我怎么能用光标做到?

注意:我希望尽可能不将我的存储过程的内容复制到CTE中以简化代码维护。

1 个答案:

答案 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

有没有人有其他想法?