2011-02-23 57 views
1

这是我的sql查询的一个例子:从光标选择....有EXEC

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 ... 

回答

1

嘿, 你不能这样做的..

但你可以使用一个功能,做一个从dbo.FunctionName选择*(@Param)

个人而言,我会尽量避免使用光标。

如果有可能获得您的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) 
+1

这将是最有效的方式,如果你有访问底层表。也许在最后的声明中使用'FROM'子句可以让你的意图更清晰。 – 2011-02-23 11:30:42

2

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

使用游标通常被认为是低效率的,但你可以像这样的东西替代它:

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