Możesz uniknąć określania wyraźnej kolejności w następujący sposób:
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};
Należy jednak pamiętać, że jest to tylko sposób na uniknięcie określania zamówienia i NIE gwarantuje że zachowana zostanie jakakolwiek oryginalna kolejność danych. Istnieją inne czynniki, które mogą spowodować uporządkowanie wyniku, takie jak ORDER BY
w zewnętrznym zapytaniu. Aby to w pełni zrozumieć, należy zdać sobie sprawę, że pojęcie „nie uporządkowane (w określony sposób)” to nie to samo, co „zachowanie pierwotnego porządku” (który JEST uporządkowany w określony sposób!). Uważam, że z perspektywy czystej relacyjnej bazy danych ta druga koncepcja nie istnieje , z definicji (chociaż mogą istnieć implementacje baz danych, które to naruszają, SQL Server nie jest jedną z nich).
Powodem podpowiedzi blokujących jest zapobieganie sytuacji, w której jakiś inny proces wstawia wartość, której planujesz użyć, pomiędzy częściami wykonywanych zapytań.
Uwaga:wiele osób używa (SELECT NULL)
aby ominąć ograniczenie "brak stałych dozwolonych w klauzuli ORDER BY funkcji okienkowej". Z jakiegoś powodu wolę 1
ponad NULL
.
Ponadto:myślę, że kolumna tożsamości jest znacznie lepsza i powinna być używana zamiast tego. W przypadku współbieżności blokowanie wyłącznie całych tabel nie jest dobre. Niedopowiedzenie.