Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2005 ROW_NUMBER () không có ORDER BY

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo trường hợp cho dịch vụ SQL Server thông thường

  2. SQL Server NẾU KHÔNG TỒN TẠI Sử dụng?

  3. Bạn sẽ triển khai các trình tự trong Microsoft SQL Server như thế nào?

  4. SQL DELETE với INNER JOIN

  5. Cách tạo bảng với ràng buộc khóa ngoại trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 66