Sql 从光标到选择。。。。和一个执行官
这是我的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
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
子句会让你的意图更清楚。