SQL Update mit Zeilennummer ()
Will ich update meine Spalte CODE_DEST mit einer inkrementellen Nummer. Ich habe:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Ich würde gerne ein update auf:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Habe ich versucht diesen code:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Das funktioniert nicht, denn der )
Habe ich auch schon 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
Aber auch das funktioniert nicht, weil der union.
Wie kann ich ein update einer Spalte mit der ROW_NUMBER()
- Funktion in SQL Server 2008 R2?
Kommentar zu dem Problem
Post-sample-Daten und erwarteten Ergebnisse, das ist der beste Weg, um eine SQL-Antwort mit. Andernfalls wird Ihre ? macht keinen Sinn und ergibt Antworten wie diese
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
InformationsquelleAutor der Frage user609511 | 2012-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine weitere option
InformationsquelleAutor der Antwort Aleksandr Fedorenko
versuchen, diese
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
InformationsquelleAutor der Antwort vasin1987
InformationsquelleAutor der Antwort user609511
Ihrem zweiten Versuch gescheitert, vor allem, weil Sie mit dem Namen der CTE derselbe wie die zugrunde liegende Tabelle und die aus der CTE Aussehen, als ob es war ein rekursive CTE, weil es im wesentlichen verwiesen wird, selbst. Ein rekursive CTE müssen eine bestimmte Struktur haben, die erfordert die Verwendung von
UNION ALL
set operator.Stattdessen konnte Sie nur haben, angesichts der CTE einen anderen Namen Hinzugefügt, die Spalte Ziel:
InformationsquelleAutor der Antwort Andriy M
Dies ist eine modifizierte version von @Aleksandr Fedorenko Antwort hinzufügen einer WHERE-Klausel:
Durch hinzufügen einer WHERE-Klausel ich fand die Leistung verbesserte sich Massiv für spätere updates. Sql Server scheint, die Zeile zu aktualisieren, selbst wenn der Wert bereits vorhanden ist, und es braucht Zeit, dies zu tun, so das hinzufügen der where-Klausel macht es einfach überspringen Zeilen, wo der Wert sich nicht geändert hat. Ich muss sagen, ich war erstaunt, wie schnell es laufen konnte meiner Abfrage.
Disclaimer: ich bin kein DB-Experte, und ich bin mit PARTITION für meine Klausel, so kann es nicht exakt die gleichen Ergebnisse für diese Abfrage. Für mich ist die Spalte in der Frage ist eine Kunden Bestellung bezahlt haben, so wird der Wert in der Regel nicht ändern, sobald Sie gesetzt ist.
Auch sicherstellen, dass Sie Indizes, vor allem, wenn Sie eine WHERE-Klausel für die SELECT-Anweisung. Einen gefilterten index, gearbeitet hat ideal für mich, wie ich war-Filterung basierend auf zahlstatus.
Meine Abfrage mit PARTITION
'IST NICHT NULL' - Teil ist nicht erforderlich, wenn die Spalte nicht null-Werte zulassen.
Wenn ich sage, die Leistung zu erhöhen war Massiv, ich meine, es war im wesentlichen augenblicklich beim Update eine kleine Anzahl von Zeilen. Mit den richtigen Indizes ich war in der Lage zu erreichen ein update, dauerte die gleiche Zeit wie die "innere" Abfrage funktioniert von selbst:
InformationsquelleAutor der Antwort Simon_Weaver
Einfache Art und Weise aktualisieren Sie den cursor
InformationsquelleAutor der Antwort Rahim Surani