मैं 2005 पर परीक्षण नहीं कर सकता, लेकिन आप चीजों को ठीक करने के लिए सीटीई का उपयोग करने में सक्षम होना चाहिए;
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;
जो परिणाम देता है:
1 1 one 1
2 1 two 2
3 1 three 3
4 1 four 4
5 1 five 5
अपडेट करें
यदि क्वेरी कभी केवल एक FKID सम्मिलित करेगी, तो निम्न सरलीकृत संस्करण भी काम करेगा (आपकी वर्तमान क्वेरी में आवश्यक परिवर्तन हाइलाइट किए गए हैं):
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)
(SELECT 1)
. का उद्देश्य ROW_NUMBER
. में का ORDER BY
खंड किसी विशेष आदेश को निर्दिष्ट करने से बचने के लिए है। इसे किसी और चीज़ में बदला जा सकता है (उदाहरण के लिए X.value('.','VARCHAR(10)'
) ), यदि आवश्यक हो।