मान लीजिए हमने:एसक्यूएल सर्वर - केवल .modify का उपयोग कर दो एक्सएमएल विलय()
:CREATE TABLE #Users(id INT PRIMARY KEY, name VARCHAR(100), suggestions XML);
INSERT INTO #Users(id, name, suggestions)
SELECT 1, 'Bob', N'<Products>
<Product id="1" score="1"/>
<Product id="2" score="5"/>
<Product id="3" score="4"/>
</Products>'
UNION ALL
SELECT 2, 'Jimmy', N'<Products>
<Product id="6" score="3"/>
</Products>';
DECLARE @userId INT = 1,
@suggestions XML = N'<Products>
<Product id="2" score="5"/>
<Product id="3" score="2"/>
<Product id="7" score="1" />
</Products>';
अब मैं id
विशेषता के आधार पर 2 XMLs मर्ज करना चाहते हैं
आईडी = 1:
<Products>
<Product id="1" score="1"/> -- nothing changed (but not exists in @suggestions)
<Product id="2" score="5"/> -- nothing changed (but exists in @suggestions)
<Product id="3" score="2"/> -- update score to 2
<Product id="7" score="1"/> -- insert new element
</Products>
के साथ उपयोगकर्ता के लिए अंतिम परिणाम
कृपया ध्यान दें कि यह 2 एक्सएमएल के संयोजन नहीं है लेकिन "अपरर्ट" ऑपरेशन है।
टिप्पणी:
- मुझे पता है कि स्कीमा इस तरह का डेटाबेस सामान्यीकरण उल्लंघन करती है और सामान्य यह जाने का रास्ता है (लेकिन इस मामले में)
- मैं समाधान है कि व्युत्पन्न तालिकाओं का उपयोग पता है,
.nodes()
और.value()
कार्यों दोनों XML को पार्स, तो विलय और वापस लिखें
मैं तलाश कर रहा हूँ करने के लिए पहलेहैअभिव्यक्ति जो इसे एक कथन में विलय करेगी (कोई व्युत्पन्न तालिकाओं/गतिशील-एसक्यूएल *):
* यदि पूरी तरह से आवश्यक है, तो डायनामिक एसक्यूएल का उपयोग किया जा सकता है, लेकिन मैं इससे बचना चाहता हूं।
UPDATE #Users
SET suggestions.modify(... sql:variable("@suggestions") ...); --changes only here
WHERE id = @userId;
/* replace ... for ... where ... with sql:variable */
मैं आवश्यकताओं आराम कर सकते हैं, इतने पर जाना और गतिशील-एसक्यूएल दिखाएं :) वैसे भी मैं 2 दिनों के बाद उपहार प्रदान करूंगा और इसे कुछ दिनों के बाद स्वीकार करूँगा। – lad2025
@ lad2025 गतिशील रूप से इसे दो बार संशोधित करने की आवश्यकता होगी()। और विज्ञापन-प्रसार एसक्यूएल के लिए कोई मौका नहीं है। वास्तव में कोई विकल्प नहीं ... – Shnugo