2012-02-10 12 views
6

चलो कहते हैं कि मैं अपने डेटाबेसविलय एक्सएमएल

<!-- XML 1 --> 
<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 1 c value</item> 
</pairs> 

<!-- XML 2 -->  
<pairs> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 1 e value</item> 
</pairs> 

इस डेटा XML डेटाप्रकार का उपयोग कर दो अलग-अलग तालिकाओं में संग्रहीत किया जाता है में XML के बाद दो टुकड़े हैं, इसके साथ ही इस XML स्तंभ एक से लिंक है

: स्कीमा कि एक संग्रहीत प्रक्रिया/समारोह के भीतर की उम्मीद एक्सएमएल जैसे

[PairData] [xml](CONTENT [foo].[Pairs]) NULL 

का स्वरूप का वर्णन मैं निम्नलिखित में इन दो एक्सएमएल संरचनाओं मर्ज करना चाहते हैं

<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 2 e value</item> 
</pairs> 

तो, एक्सएमएल के पहले टुकड़े से हम ले लिया है आइटम:

a, b 

एक्सएमएल के दूसरे टुकड़े से हम ले लिया है आइटम:

c, d, e 

सूचना है कि XML के दो टुकड़े

c 

इस परिदृश्य में एक्सएमएल 2 से मूल्य मर्ज किए गए में इस्तेमाल किया जाना चाहिए: की एक प्रमुख के साथ एक आम आइटम एक्सएमएल (एक्सएमएल 1 से मूल्य को छोड़कर)। एक और मामला यह है कि एक्सएमएल 1 या 2 नल हो सकता है इसलिए मर्ज प्रक्रिया को इसे संभालना चाहिए और बस दूसरे को वापस करना चाहिए। या दोनों नल हो सकते हैं, इस मामले में न्यूल वापस आ गया है।

एक तरफ, हमारे वर्तमान कार्यान्वयन में हम डीबी से दोनों एक्सएमएल दस्तावेज़ लौट रहे हैं और कोड में विलय कर रहे हैं। हालांकि हम इस विलय को डीबी के भीतर करना पसंद करेंगे क्योंकि कई असंबंधित प्रक्रियाएं इस प्रो को कॉल कर रही हैं।

+0

उत्तर डेटा संग्रहण पर निर्भर करता है। (उदाहरण के लिए आपका स्रोत एक टेबल, एक एक्सएमएल कॉलम या एक वर्ण स्ट्रिंग है)। यह अच्छा होगा अगर आप अधिक जानकारी प्रदान कर सकते हैं। –

+0

टिप्पणी के लिए चीयर्स, प्रश्न अद्यतन। – MrEyes

उत्तर

5

उपयोग:

declare @x1 xml ='<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 1 c value</item> 
</pairs>' 

declare @x2 xml ='<pairs> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 2 e value</item> 
</pairs>' 

select * 
from 
(
    select isnull(t2.a, t1.a) [@key], isnull(t2.b, t1.b) [text()] 
    from 
    (
     select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b] 
     from @x1.nodes('/*/item') t(c) 
    )t1 
    full join 
    (
     select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b] 
     from @x2.nodes('/*/item') t(c) 
    )t2 on t2.a = t1.a 
)t 
for xml path('item'), root('pairs') 

आउटपुट:

<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 2 e value</item> 
</pairs> 

अद्यतन:

declare @x1 xml ='<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 1 c value</item> 
</pairs>' 

declare @x2 xml ='<pairs> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 2 e value</item> 
</pairs>' 

declare @t1 table(id int, data xml) 
insert @t1 values(1, @x1) 

declare @t2 table(id int, data xml) 
insert @t2 values(1, @x2) 

select isnull(t2.a, t1.a) [@key], isnull(t2.b, t1.b) [text()] 
from 
(
    select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b] 
    from @t1 ta 
    cross apply ta.data.nodes('/*/item') t(c) 
)t1 
full join 
(
    select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b] 
    from @t2 ta 
    cross apply ta.data.nodes('/*/item') t(c) 
)t2 on t2.a = t1.a 
for xml path('item'), root('pairs') 
+0

यह पूरी तरह से काम करता है, केवल एक छोटा सा प्रश्न मैं इसे बदलने के बारे में कैसे जाउंगा ताकि यह घोषित वर्रों की बजाय तालिकाओं से चयन कर रहा हो। – MrEyes

+0

@MrEyes, मैंने अपना जवाब अपडेट कर लिया है। –

1

तालिकाओं के साथ उदाहरण:

012,
CREATE TABLE #x1 (row_key int, source_xml xml) 
CREATE TABLE #x2 (row_key int, source_xml xml) 

DECLARE @x1 xml = 
'<pairs> 
    <item key="a">xml 1 a value</item> 
    <item key="b">xml 1 b value</item> 
    <item key="c">xml 1 c value</item> 
</pairs>' 


DECLARE @x2 xml = 
'<pairs> 
    <item key="c">xml 2 c value</item> 
    <item key="d">xml 2 d value</item> 
    <item key="e">xml 1 e value</item> 
</pairs>' 

INSERT INTO #x1 VALUES (1, @x1) 
INSERT INTO #x2 VALUES (1, @x2) 

SELECT 
    ISNULL(a.item_key, b.item_key) [@key] 
    ,ISNULL(b.item_value, a.item_value) [text()] 
FROM 
(
SELECT 
    b.value('@key', 'char(1)') item_key, b.value('.', 'nvarchar(100)') item_value 
FROM 
    #x1 cross apply #x1.source_xml.nodes('./pairs/item') a(b) 
WHERE 
    row_key = 1 
) a 
FULL JOIN 
( 
SELECT 
    b.value('@key', 'char(1)') item_key, b.value('.', 'nvarchar(100)') item_value 
FROM 
    #x2 cross apply #x2.source_xml.nodes('pairs/item') a(b) 
WHERE 
    row_key = 1 
) b 
ON 
    a.item_key = b.item_key 
ORDER BY 
    ISNULL(a.item_key, b.item_key) 
FOR XML PATH ('item'), ROOT ('pairs') 

DROP TABLE #x1 
DROP TABLE #x2 
संबंधित मुद्दे