这个脚本需要花费数小时才能执行,有没有办法删除光标并仍然遍历主键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
感谢。
答案 0 :(得分:1)
当然......只需插入/选择
insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed
答案 1 :(得分:1)
实际上插入逻辑中有很多select语句。
所以我删除了Cursor并使用连接插入表,该表有100列和近10万行,并且花了2分钟来插入所有数据。
使用游标需要18个小时,所以使用加速超快速。
答案 2 :(得分:0)
很可能问题不在于光标,而是你的插入逻辑。您应该验证您的计算机上是否有足够的内存来执行此循环,并且您在表上有索引。
有些地方要开始:
答案 3 :(得分:0)
使用函数并将select语句的行放在插入逻辑中的那个返回结果表的函数中,并使用cross apply将函数与游标的select语句连接起来 选择mytable1.result FROM ResponseTable 交叉应用(select * from function(ResponseTable.responseId)dd 其中dd.responseId = ResponseTable.responseId)mytable1
其中mytable1.responseId = ResponseTable.responseId