SQL Server 2005 ROW_NUMBER() ohne ORDER BY
Ich versuche, einfügen von einer Tabelle in eine andere mit
DECLARE @IDOffset int;
SELECT @IDOffset = MAX(ISNULL(ID,0)) FROM TargetTable
INSERT INTO TargetTable(ID, FIELD)
SELECT [Increment] + @IDOffset ,FeildValue
FROM SourceTable
WHERE [somecondition]
TargetTable.ID ist keine identity-Spalte, das ist, warum ich zu finden ein Weg, um auto-increment-es selbst.
Ich weiß, ich kann einen cursor oder eine Tabelle erstellen variable, die mit einer identity-Spalte und eine FieldValue Feld, füllen Sie es, dann benutzen Sie es in mein insert into...select
aber das ist nicht sehr effizient. Ich habe versucht mit der ROW_NUMBER-Funktion erhöht, aber ich habe nicht wirklich einen legitimen ORDER BY-Feld in der SourceTable, die ich nutzen kann und möchte, um die original-Reihenfolge der SourceTable (wenn möglich).
Kann jemand etwas empfehlen?
InformationsquelleAutor der Frage Fragilerus | 2011-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie vermeiden Sie die Angabe einer expliziten Bestellung wie folgt:
Bitte beachten Sie jedoch, dass nur ein Weg zur Vermeidung der Angabe einer Bestell-und garantiert NICHTdass alle ursprünglichen Daten der Bestellung wird bewahrt werden. Es gibt andere Faktoren, die verursachen können, das Ergebnis bestellt werden, wie ein
ORDER BY
in der äußeren Abfrage. Um das ganz zu verstehen, muss man erkennen, dass das Konzept "nicht bestellt (in bestimmter Weise)" ist nicht das gleiche wie "Beibehaltung der ursprünglichen Ordnung" (die bestellt IST, die in einer bestimmten Art und Weise!). Ich glaube, dass aus einer rein relationalen Datenbank-Perspektive, das Letztgenannte Konzept nicht vorhandenper definition (obwohl es kann Datenbank-Implementierungen, die gegen diese, SQL-Server ist nicht einer von Ihnen).Den Grund für die Sperre Andeutungen ist zu verhindern, dass der Fall, wo einige andere Prozess fügt mit dem Wert, den Sie verwenden möchten, in der zwischen den teilen der die Abfrage ausgeführt wird.
Hinweis: Viele Menschen nutzen
(SELECT NULL)
zu bekommen, um die "keine Konstanten, Sie dürfen in der ORDER BY-Klausel eine windowing Funktion" Einschränkung. Aus irgendeinem Grund, ich bevorzuge1
überNULL
.Außerdem: ich denke, eine identity-Spalte ist weit überlegen und sollte stattdessen verwendet werden. Es ist nicht gut für die Parallelität exklusiv sperren ganzer Tabellen. Understatement.
InformationsquelleAutor der Antwort ErikE
Können Sie ignorieren die Bestellung mithilfe
order by (select null)
wie diese:InformationsquelleAutor der Antwort Mohammad Anini