【问题标题】:From CURSOR to SELECT.... with an EXEC从 CURSOR 到 SELECT.... 使用 EXEC
【发布时间】:2011-02-23 10:56:45
【问题描述】:

这是我的 sql 查询示例:

Declare cursorA CURSOR FOR
SELECT idA FROM A WHERE ...

OPEN cursorA 
Fetch Next From cursorA Into @my_id

While @@fetch_status <> -1
begin
  if @@fetch_status <> -2
  begin
     INSERT #TEMP_TABLE
     EXEC sp_MyStoredProcedure @my_id
  end
  Fetch Next From cursorA Into @my_id
end

Close      cursorA 
Deallocate cursorA 

如何使用 SELECT 进行转换,例如:

INSERT #TEMP_TABLE
EXEC sp_MyStoredProcedure idA 
FROM A WHERE ...

?

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    恐怕不能直接查询存储过程的结果集。大概这就是为什么光标首先在那里的原因。

    通常认为使用游标效率低下,但您可以将其替换为以下内容:

    -- get IDs
    SELECT idA
    INTO #tmpIds
    FROM A
    
    -- add row numbers and index for query speed (may not be needed if A is small)
    ALTER TABLE #tmpIds ADD RowNum int IDENTITY(1,1)
    CREATE CLUSTERED INDEX IDX_tmpIDs_RowNum ON #tmpIds(RowNum)
    
    DECLARE @my_id int, @rowNum int, @rowCount int   
    SET @rowNum = 1
    SELECT @rowCount = COUNT(*) FROM #tmpIds
    
    -- iterate over #tmpIds
    While @rowNum <= @rowCount
    begin
        SELECT @my_id = idA FROM #tmpIds WHERE RowNum = @RowNum
    
        INSERT #TEMP_TABLE
        EXEC sp_MyStoredProcedure @my_id
    
        SET @rowNum = @rowNum + 1
    end
    

    【讨论】:

      【解决方案2】:

      你好, 你不能那样做..

      但是您可以使用一个函数并从 dbo.FunctionName(@Param) 中执行 Select *

      我个人会避免使用光标。

      如果可以获取您的 ID,然后使用 TempTable 并根据表中的变量列表执行查询并扩展表以满足与光标相同的条件会更好。

      但我可以看到您在后面的评论中可能存在限制。

      StoredProcReturn 的作用是什么?

      我会做这样的事情:

      CREATE TABLE @tmp
      (
      value int
      )
      
      INSERT INTO @tmp (value)
      SELECT idA FROM A
      
      INSERT INTO #tmpTable
      SELECT value1, value2, value3
      FROM dbo.function1(@tmp)
      

      【讨论】:

      • 如果您可以访问基础表,这将是最有效的方法。也许最后声明中的示例FROM 子句会使您的意图更加清晰。
      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 2013-08-04
      • 2022-06-29
      • 2014-01-02
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2012-06-28
      相关资源
      最近更新 更多