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

Tăng số thứ tự trên SQL insert

Tôi không thể kiểm tra vào năm 2005, nhưng bạn có thể sử dụng CTE tốt để đánh số thứ tự;

DECLARE @FKID INT
SET @FKID = 1
DECLARE @NEWDATA XML
SET @NEWDATA = '<data><text>three</text><text>four</text><text>five</text></data>'

;WITH cte AS (SELECT @FKID FKID, X.value('.','VARCHAR(10)') a, 
                  ROW_NUMBER() OVER (ORDER BY X) r
             FROM @NEWDATA.nodes('/data/text') AS X(X))
INSERT INTO TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])
SELECT fkid, a,
  (SELECT ISNULL(MAX([SEQUENCE]),0)+r FROM TEMPTABLE WHERE [FKID]=cte.fkid)
FROM cte;

SELECT * FROM TEMPTABLE;

cho kết quả:

1    1    one     1
2    1    two     2
3    1    three   3
4    1    four    4
5    1    five    5

CẬP NHẬT

Nếu truy vấn chỉ chèn một FKID, thì phiên bản đơn giản sau đây cũng sẽ hoạt động (các thay đổi cần thiết đối với truy vấn hiện tại của bạn được đánh dấu):

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])
SELECT @FKID, 
       X.value('.','VARCHAR(10)'),
       (SELECT ISNULL(MAX([SEQUENCE]),0)+1 FROM #TEMPTABLE WHERE [FKID][email protected])
        + ROW_NUMBER() OVER (ORDER BY (SELECT 1))
FROM @NEWDATA.nodes('/data/text') AS X(X)

Mục đích của (SELECT 1) trong ROW_NUMBER của ORDER BY mệnh đề này là để tránh chỉ định bất kỳ thứ tự cụ thể nào. Nó có thể được thay đổi thành một cái gì đó khác (ví dụ:thành X.value('.','VARCHAR(10)' ), nếu cần.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cần trợ giúp trong truy vấn động với Mệnh đề IN

  2. Tính toán khoảng cách với cơ sở dữ liệu SQL Server khổng lồ

  3. Thực thi thủ tục được lưu trữ từ một hàm

  4. Xếp tầng sao chép một hàng với tất cả các hàng con và các hàng con của chúng, v.v.

  5. Không có tập hợp sao lưu nào được chọn để khôi phục SQL Server 2012