Sql 从光标到选择。。。。和一个执行官

Sql 从光标到选择。。。。和一个执行官,sql,sql-server-2005,stored-procedures,Sql,Sql Server 2005,Stored Procedures,这是我的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_MyStoredPro

这是我的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 

嘿, 你不能那样做

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

就我个人而言,我会避免使用光标

如果有可能获得您的ID,然后使用一个诱人的函数,并根据表中的变量列表执行查询,并展开表以满足与游标相同的条件,则效果会更好

但我可以看出,在后面的评论中,您可能有一些局限性

StoredProReturn是什么

我会这样做:

CREATE TABLE @tmp
(
value int
)

INSERT INTO @tmp (value)
SELECT idA FROM A

INSERT INTO #tmpTable
SELECT value1, value2, value3
FROM dbo.function1(@tmp)

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

使用游标通常被认为是低效的,但您可以用以下内容替换它:

INSERT #TEMP_TABLE
EXEC sp_MyStoredProcedure idA 
FROM A WHERE ...
-- 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
——获取ID
选择idA
进入#tmpIds
从
--为查询速度添加行号和索引(如果A较小,则可能不需要)
ALTER TABLE#TMPID添加RowNum int标识(1,1)
在#tmpIDs(RowNum)上创建聚集索引IDX_tmpIDs_RowNum
声明@my_id int、@rowNum int、@rowCount int
设置@rowNum=1
从#tmpIds中选择@rowCount=COUNT(*)
--在#tmpIds上迭代

而@rowNum如果您可以访问基础表,那么这将是最有效的方法。也许最后陈述中的一个示例
FROM
子句会让你的意图更清楚。