0

这个脚本需要几个小时才能执行,有没有办法删除光标并仍然在主键上迭代表responseId

DECLARE ResponseCursor CURSOR
FOR
     SELECT responseId FROM ResponseTable

FETCH NEXT FROM ResponseCursor INTO @ResponseId

WHILE @@fetch_Status =0
BEGIN
    --Insert Logic 
    FETCH NEXT FROM ResponseCursor INTO @ResponseId
END

CLOSE ResponseCursor
DEALLOCATE ResponseCursor

谢谢。

4

4 回答 4

1

实际上插入逻辑中有很多选择语句。

所以我删除了 Cursor 并使用连接插入了该表,该表有 100 列和近 10 万行,插入所有数据需要 2 分钟。

使用游标需要 18 个小时,因此使用连接速度非常快。

于 2012-04-15T15:53:11.623 回答
1

当然......只需插入/选择

insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed
于 2012-04-10T12:14:21.310 回答
0

使用函数并将选择语句的行放入该函数的插入逻辑中,该函数返回结果表并使用交叉应用将函数与游标的选择语句连接 SELECT mytable1.result FROM ResponseTable cross apply ( select *from function (ResponseTable.responseId) dd 其中 dd.responseId=ResponseTable.responseId) mytable1

其中 mytable1.responseId=ResponseTable.responseId

于 2013-12-10T07:35:46.643 回答
0

很有可能问题不是光标,而是您的插入逻辑。你应该验证你的机器上有足够的内存来执行这个循环,并且你的表上有一个索引。

一些开始的地方:

  1. 运行游标所做的选择语句需要多长时间?
  2. 插入逻辑的单次迭代需要多长时间?
  3. 你是在做插入还是插入选择?检查选择需要多长时间运行,并检查该查询的索引。
于 2012-04-10T12:48:26.277 回答