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.