Можете да избегнете посочването на изрична подредба, както следва:
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};
Въпреки това, моля, имайте предвид, че това е само начин да избегнете посочването на поръчка и НЕ гарантира че всяко оригинално подреждане на данни ще бъде запазено. Има и други фактори, които могат да доведат до подреждане на резултата, като например ORDER BY
във външната заявка. За да разберем напълно това, човек трябва да осъзнае, че понятието „не е подредено (по определен начин)“ не е същото като „запазване на оригиналния ред“ (което Е подредено по определен начин!). Вярвам, че от гледна точка на чиста релационна база данни, последното понятие не съществува , по дефиниция (въпреки че може да има реализации на база данни, които нарушават това, SQL Server не е един от тях).
Причината за подсказките за заключване е да се предотврати случай, когато някой друг процес се вмъкне, използвайки стойността, която планирате да използвате, между частите на изпълнението на заявката.
Забележка:Много хора използват (SELECT NULL)
за да заобиколите ограничението "не са разрешени константи в клаузата ORDER BY на функция за прозорец". По някаква причина предпочитам 1
над NULL
.
Също така:Мисля, че колоната за идентичност е много по-добра и трябва да се използва вместо това. Не е добре едновременността да заключва изключително цели таблици. Подценяване.