Ich möchte meine Spalte CODE_DEST mit einer inkrementellen Nummer aktualisieren. Ich habe:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Ich möchte es aktualisieren, um zu sein:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Ich habe diesen Code ausprobiert:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Dies funktioniert wegen der nicht )
Ich habe auch versucht:
WITH DESTINATAIRE_TEMP AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
Das funktioniert aber auch wegen der Gewerkschaft nicht.
Wie kann ich eine Spalte mit der ROW_NUMBER()
Funktion in SQL Server 2008 R2 aktualisieren ?
sql-server
sql-server-2008-r2
sql-update
user609511
quelle
quelle
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Antworten:
Noch eine Option
quelle
Versuche dies
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
quelle
SET CODE_DEST = @id, @id = @id + 1
zur besseren Lesbarkeit.quelle
Ihr zweiter Versuch schlug in erster Linie fehl, weil Sie den CTE wie die zugrunde liegende Tabelle benannt und den CTE so aussehen ließen, als wäre er ein rekursiver CTE , da er sich im Wesentlichen selbst referenzierte. Ein rekursiver CTE muss eine bestimmte Struktur haben, die die Verwendung des
UNION ALL
Set-Operators erfordert .Stattdessen hätten Sie dem CTE einfach einen anderen Namen geben und die Zielspalte hinzufügen können:
quelle
Dies ist eine modifizierte Version der Antwort von @Aleksandr Fedorenko, in der eine WHERE-Klausel hinzugefügt wird:
Durch Hinzufügen einer WHERE-Klausel stellte ich fest, dass sich die Leistung für nachfolgende Updates massiv verbessert hat. SQL Server scheint die Zeile zu aktualisieren, auch wenn der Wert bereits vorhanden ist und dies einige Zeit in Anspruch nimmt. Wenn Sie also die where-Klausel hinzufügen, werden nur Zeilen übersprungen, in denen sich der Wert nicht geändert hat. Ich muss sagen, ich war erstaunt, wie schnell meine Abfrage ausgeführt werden konnte.
Haftungsausschluss: Ich bin kein DB-Experte und verwende PARTITION BY für meine Klausel, sodass bei dieser Abfrage möglicherweise nicht genau die gleichen Ergebnisse erzielt werden. Für mich ist die betreffende Spalte die bezahlte Bestellung eines Kunden, sodass sich der Wert im Allgemeinen nicht ändert, sobald er festgelegt ist.
Stellen Sie außerdem sicher, dass Sie über Indizes verfügen, insbesondere wenn die SELECT-Anweisung eine WHERE-Klausel enthält. Ein gefilterter Index hat für mich hervorragend funktioniert, da ich nach Zahlungsstatus gefiltert habe.
Meine Anfrage mit PARTITION von
Der Teil 'IS NOT NULL' ist nicht erforderlich, wenn die Spalte nicht nullwertfähig ist.
Wenn ich sage, dass die Leistungssteigerung massiv war, meine ich, dass sie beim Aktualisieren einer kleinen Anzahl von Zeilen im Wesentlichen sofort erfolgte. Mit den richtigen Indizes konnte ich ein Update erzielen, das genauso lange dauerte wie die 'innere' Abfrage selbst:
quelle
Ich habe das für meine Situation getan und gearbeitet
quelle
Einfache und einfache Möglichkeit, den Cursor zu aktualisieren
quelle
Wenn die Tabelle keine Beziehung hat, kopieren Sie einfach alle in die neue Tabelle mit der Zeilennummer und entfernen Sie die alte und benennen Sie die neue mit der alten um.
quelle