SQL Server遍历ID列表时游标代码报错,求解决方案
解决SQL游标遍历ID插入数据时的变量未声明错误
错误原因
你混淆了表变量和标量变量的用法:
@ProductIds是你声明的表变量,用来存储一组ID;- 游标每次只能取出单个ID值,需要存入一个标量变量(单个值的变量),但你直接试图把数据存入表变量,同时代码里还用到了未声明的
@ProductId,这就触发了“未声明标量变量”的报错。
修正后的代码
先声明一个标量变量@ProductId来接收游标取出的单个ID,再修正所有变量引用:
DECLARE @ProductIds TABLE (ID nvarchar(1000)) INSERT INTO @ProductIds (ID) SELECT ProductTypeId FROM ProductType -- 新增:声明存储单个ID的标量变量 DECLARE @ProductId nvarchar(1000) DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT DISTINCT ID FROM @ProductIds OPEN MY_CURSOR -- 把游标取出的单个ID存入标量变量 FETCH NEXT FROM MY_CURSOR INTO @ProductId WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO myProducts (ProductTypeId, prodDesc, Value) VALUES (@ProductId, 'CA1BBFC3-35EA-4984-BCD1-9E0EB385E4BE', 0) PRINT @ProductId FETCH NEXT FROM MY_CURSOR INTO @ProductId END CLOSE MY_CURSOR DEALLOCATE MY_CURSOR
更高效的替代方案
SQL是基于集合的语言,游标属于逐行操作,效率远低于集合操作。你完全可以跳过游标和临时表,直接用INSERT...SELECT完成批量插入:
INSERT INTO myProducts (ProductTypeId, prodDesc, Value) SELECT DISTINCT ProductTypeId, 'CA1BBFC3-35EA-4984-BCD1-9E0EB385E4BE', 0 FROM ProductType
这个语句直接从ProductType表中取出去重后的ProductTypeId,批量插入到myProducts表,代码更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者dros
相关产品推荐
相关产品推荐

