Bạn có thể tránh chỉ định một thứ tự rõ ràng như sau:
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};
Tuy nhiên, xin lưu ý rằng đó chỉ là một cách để tránh chỉ định một đơn đặt hàng và KHÔNG đảm bảo rằng mọi thứ tự dữ liệu ban đầu sẽ được giữ nguyên. Có những yếu tố khác có thể khiến kết quả được sắp xếp theo thứ tự, chẳng hạn như ORDER BY
trong truy vấn bên ngoài. Để hiểu đầy đủ điều này, người ta phải nhận ra rằng khái niệm "không được đặt hàng (theo một cách cụ thể)" không giống như "giữ lại trật tự ban đầu" (mà IS đã ra lệnh theo một cách cụ thể!). Tôi tin rằng từ góc độ cơ sở dữ liệu quan hệ thuần túy, khái niệm thứ hai không tồn tại , theo định nghĩa (mặc dù có thể có các triển khai cơ sở dữ liệu vi phạm điều này, SQL Server không phải là một trong số chúng).
Lý do cho gợi ý khóa là để ngăn trường hợp một số quy trình khác chèn giá trị bạn định sử dụng vào giữa các phần của truy vấn đang thực thi.
Lưu ý:Nhiều người sử dụng (SELECT NULL)
để giải quyết hạn chế "không có hằng số nào được phép trong mệnh đề ORDER BY của hàm cửa sổ". Vì lý do nào đó, tôi thích 1
trên NULL
.
Ngoài ra:Tôi nghĩ rằng cột nhận dạng vượt trội hơn nhiều và nên được sử dụng để thay thế. Nó không tốt cho đồng thời khi chỉ khóa toàn bộ các bảng. Nói cách khác.