2017-10-12 96 views
-3

我想更新一个包含200万行的表。我想更新该表中的三列,以查找表POII中包含800行和3列的特定项目名称。循环更新sql服务器中的光标

我需要写一个游标在SQL Server 2014

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

表有2万条记录是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

这是一个游标的语法一个很好的资源:https://blog.sqlauthority.com/2007/01/01/sql-server-simple-example-of-cursor/amp/ – mendosi

+0

你能请通过查看你的链接来帮助我查询... – Khokae

+2

男人,请参阅@mendosi在这种情况下使用光标(在大多数情况下)的答案是一个矫枉过正的问题 – jean

回答

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; 
+0

,,,非常感谢你,因为它与更新命令一起工作,但是当我在SQL Server上触发光标时发生此错误。“消息137,级别15,状态2,行9 必须声明标量变量”at速率销售组“ 当我正在执行行”FETCH NEXT FROM cursor1 INTO时,速率子类别中的速率itemname;速率销售组,速率类别上;“ – Khokae