2017-10-12 28 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