2017-10-12 1 views
-3

Ich möchte eine Tabelle mit 2 Millionen Zeilen aktualisieren. Ich möchte drei Spalten in dieser Tabelle für einen bestimmten Elementnamen aktualisieren, der aus der Tabelle POII besteht, die 800 Zeilen und 3 Spalten enthält.Schleife Update Cursor in SQL-Server

Ich brauche 2014

Wie man einen Cursor für die in SQL Server zu schreiben, sollte ich es schreiben? Es gibt einen Syntaxfehler.

Die Tabelle mit 2 Millionen Datensätze ist 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

Dies ist eine gute Ressource für die Syntax eines Cursors: https://blog.sqlauthority.com/2007/01/01/sql-server-simple-example-of-cursor/amp/ – mendosi

+0

Können Sie bitte helfen Sie mir mit meiner Frage, indem Sie durch Ihren Link gehen ... – Khokae

+2

Mann, @mendosi Antwort mit Cursor in diesem Fall (und in den meisten Fällen) ist ein Overkill – jean

Antwort

2

Wenn ich einige wichtige Informationen bin fehlt, diese Abfrage sollte nicht als Cursor geschrieben werden. Es ist eine einfache Aktualisierung und soll wie folgt geschrieben werden:

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

Diese Art von Update sollte wesentlich effizienter sein und schneller für Sie zu schreiben, als ein Cursor.

Ein Cursor würde so etwas geschrieben werden. Beachten Sie, dass Sie Variablen deklarieren müssen, um die Werte in der aktuellen Zeile des Cursors zu speichern, und Sie müssen jede Zeile abrufen. Vergessen Sie nicht, den Cursor zu schließen und die Zuordnung aufzuheben.

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

,,, Dankbar zu Ihnen, wie es mit Update-Befehl arbeitete, aber wenn ich Cursor auf SQL-Server fire diesen Fehler auftreten .. "Msg 137, Ebene 15, Status 2, Zeile 9 Muss die Skalarvariable" um die Rate salesgroup " Dieser Fehler tritt auf, wenn ich die Zeile" FETCH NEXT FROM cursor1 INTO bei der Rate-Salesgroup in der Rate-Kategorie in der Rate-Unterkategorie mit der Rate itemname ausführe; " – Khokae