Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server中的循环更新游标_Sql_Sql Server 2014 - Fatal编程技术网

sql server中的循环更新游标

sql server中的循环更新游标,sql,sql-server-2014,Sql,Sql Server 2014,我想更新一个包含200万行的表。我想为一个特定的项目名称更新该表中的三列,该项目名称来自包含800行和3列的表POII 我需要在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.sales

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

我需要在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; 

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

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;

这是一个很好的游标语法资源:你能通过你的链接帮我查询一下吗…伙计,在这种情况下,请看@mendosi answer使用游标,在大多数情况下是一个过度使用。你不应该为此使用游标。停止使用印度单词。我已经解决了您的问题一次.,,非常感谢您使用Update命令,但当我在sql server上启动游标时,会发生此错误。。Msg 137,级别15,状态2,第9行必须在rate salesgroup声明标量变量。当我在rate salesgroup,rate类别,rate子类别,rate itemname执行row FETCH NEXT FROM cursor1时,会发生此错误;