2012-09-13 5 views
7
DECLARE @t2 AS TABLE(id INT) 

INSERT INTO dbo.EntityMaster 
     (EntityType) 
OUTPUT INSERTED.EntityId INTO @t2 
SELECT 'G' FROM #tmp 

#tmp एक अस्थायी तालिका है जिसमें एक XML से लोड डेटा शामिल है। मुझे #tmp में निहित प्रत्येक रिकॉर्ड के लिए EntityId उत्पन्न करने की आवश्यकता है। यह रिकॉर्ड को पहले EntityMaster तालिका में डालने के द्वारा किया जा सकता है, फिर प्रत्येक इकाई के लिए इस इकाई को #tmp में डालें।अद्यतन के लिए SQL सर्वर के OUTPUT खंड का उपयोग कैसे करें

@t2 में रिकॉर्ड डालने के बजाय, मुझे प्रत्येक रिकॉर्ड के लिए #tmp अपडेट करने की आवश्यकता है।

कोई संभावना है?

+0

आप कैसे पहचाना जा सकता है #tmp में जो रिकॉर्ड है जो entityid साथ चला जाता है? – HLGEM

+0

@ एचएलजीईएम: मैं वही सोच रहा था लेकिन मुझे एंटिटीमास्टर कॉलम में GUID फ़ील्ड लेने का विचार आया जो फ्रंटेंड द्वारा उत्पन्न किया जाएगा और हमेशा अद्वितीय होगा। इसका उपयोग करके, मैं प्रत्येक रिकॉर्ड को EntityMaster –

उत्तर

1

इस तरह कुछ कोशिश करें, आपको अभी भी temp तालिका का उपयोग करना होगा, लेकिन इसे पढ़ना बहुत बुरा नहीं है और यह काम पूरा हो जाता है।

 
CREATE TABLE #tmp 
(
    tmpID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
    xmlData VARCHAR(255), 
    EntityId INT 
) 
DECLARE @t2 TABLE 
(
    tmpID INT, 
    EntityId INT 
) 

MERGE dbo.EntityMaster AS EM 
USING 
(
    SELECT tmpID, 
     xmlData, 
     EntityId 
    FROM #tmp 
) AS X 
    ON EM.EntityId = X.EntityId 
WHEN NOT MATCHED THEN 
    INSERT (EntityType) 
    VALUES (X.xmlData) 
OUTPUT X.tmpID, INSERTED.EntityId 
INTO @t2 (tmpID, EntityId); 

UPDATE T 
SET EntityId = T2.EntityId 
FROM @t2 T2 
INNER JOIN #tmp T 
    ON T2.tmpID = T.tmpID 

+0

से जोड़ सकता हूं! मुझे आपका जवाब पसंद है;) –

0

यह एसक्यूएल में पूरा करना आसान होगा जो XML रिकॉर्ड को #tmp तालिका में सम्मिलित करता है।

declare @recs table (val varchar(255)) 
insert into @recs values ('this'), ('is'), ('a'), ('test') 

आप आसानी से इस तरह प्रत्येक रिकॉर्ड करने के लिए एक बढ़ाने पूर्णांक जोड़ सकते हैं::

select row_number() over (order by (select 1)) as id, val from @recs 

निम्नलिखित @recs तालिका, जो XML से उत्पन्न रिकॉर्ड का एक सेट के रूप में सोचा जा सकता है पर विचार करें

परिणाम इस तरह दिखता है:

id val 
1 this 
2 is 
3 a 
4 test 

क्या आप इसका उपयोग कर सकते हैं row_number() over (order by (select1)) आपको एक ही समय में ids उत्पन्न करने के लिए #tmp में रिकॉर्ड डाला जा रहा है?

संबंधित मुद्दे