循环更新sql server中的游标

时间:2017-10-12 13:26:33

标签: sql sql-server-2014

我想更新一个包含200万行的表。我想更新该表中的三列,以获取来自表POII的特定项目名称,其中包含800行和3列。

我需要在SQL Server 2014中为它编写一个游标。

我该怎么写呢?它给出了语法错误。

有200万条记录的表格是MNB

DECLARE cursor1 CURSOR FOR
    Select * from poii ;
OPEN c1;


Begin
while i in cursor1 loop


Update MNB set salesgroup=i.salesgroup, category= i.category ,subcategory =i.subcategory  where itemname = i.itemname;

Commit; 

1 个答案:

答案 0 :(得分:2)

除非我遗漏了一些重要信息,否则不应将此查询写为游标。这是一个简单的更新,应该写成这样的:

UPDATE MNB
   SET salesgroup = i.salesgroup,
       category = i.category,
       subcategory = i.subcategory
   FROM MNB 
   JOIN poii ON MNB.itemname = poii.itemname;

这种更新应该比光标更有效,更快速地编写。

游标会写成这样的东西。请注意,必须声明变量以保存游标当前行中的值,并且需要获取每一行。别忘了关闭并取消分配光标。

DECLARE @salesgroup varchar(10);
DECLARE @category varchar(10);
DECLARE @subcategory varchar(10);
DECLARE @itemname varchar(10);
DECLARE cursor1 CURSOR LOCAL FAST_FORWARD FOR (
    SELECT salesgroup, category, subcategory, itemname 
      FROM poii);
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @salesgroup, @category, @subcategory, @itemname;

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE MNB
       SET salesgroup = @salesgroup,
           category = @category,
           ...
       WHERE itemname = @itemname;

    FETCH NEXT FROM cursor1 INTO @salesgroup, @category, @subcategory, @itemname;
END
CLOSE cursor1;
DEALLOCATE cursor1;