Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine Nichtidentitätsspalte in SQL Server 2005 automatisch erhöhen, ohne ORDER BY in ROW_NUMBER() zu verwenden?

Wie kann ich eine Nichtidentitätsspalte in SQL Server 2005 automatisch erhöhen, ohne ORDER BY in ROW_NUMBER() zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 18:44:09483Durchsuche

How Can I Auto-Increment a Non-Identity Column in SQL Server 2005 Without Using ORDER BY in ROW_NUMBER()?

Vermeiden von ORDER BY in SQL Server 2005 ROW_NUMBER()

Beim Einfügen von Daten aus einer Tabelle in eine andere ist es oft wünschenswert, eine automatische Inkrementierung vorzunehmen eine Nichtidentitätsspalte in der Zieltabelle. Obwohl die Funktion ROW_NUMBER() verwendet werden kann, um dies zu erreichen, erfordert sie normalerweise ein ORDER BY-Feld. Wenn jedoch die ursprüngliche Reihenfolge der Quelltabelle beibehalten werden muss, muss ein alternativer Ansatz gefunden werden.

Eine Lösung, die eine explizite Reihenfolge vermeidet, umfasst den folgenden Code:

INSERT dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};

Dieser Code verwendet eine Fensterfunktion, um Zeilennummern basierend auf einem konstanten Wert zu berechnen, wodurch die Notwendigkeit einer ORDER BY-Klausel effektiv ersetzt wird. Um Parallelitätsprobleme zu verhindern, verwendet die Abfrage außerdem Sperrhinweise (TABLOCKX und HOLDLOCK), während der Maximalwert in der Zieltabelle berechnet wird.

Es ist wichtig zu beachten, dass bei diesem Ansatz zwar die explizite Angabe einer Reihenfolge vermieden wird, dies jedoch nicht der Fall ist. Es kann nicht garantiert werden, dass die ursprüngliche Reihenfolge der Quelltabelle erhalten bleibt. Faktoren wie die Reihenfolge der äußeren Abfragen können das Ergebnis dennoch beeinflussen. Aus Datenbanksicht existiert das Konzept der „Beibehaltung der ursprünglichen Reihenfolge“ nicht wirklich.

Für optimale Parallelität und Datenintegrität wird die Verwendung einer Identitätsspalte anstelle dieser Problemumgehung dringend empfohlen. Das ausschließliche Sperren von Tabellen durch die Sperrhinweise sollte vermieden werden, sofern dies nicht unbedingt erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Nichtidentitätsspalte in SQL Server 2005 automatisch erhöhen, ohne ORDER BY in ROW_NUMBER() zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn