2010-04-13 9 views
7

में एक विशेषता डालने के दौरान निम्नलिखित कोड को आजमाते हुए 'एक्सएमएल डेटा प्रकार विधि का तर्क 1 "संशोधित करना" स्ट्रिंग अक्षर होना चाहिए "। लेकिन 'xml डेटा प्रकार विधि का तर्क 1 "संशोधित करना" एक स्ट्रिंग अक्षरशः त्रुटि होना चाहिए। बहुत खोज की, लेकिन नहीं कर सकते इस समस्याएक्सएमएल

SET @Path = '/@ParentNodeName/@NodeName/child::*' 
SET @x.modify('insert attribute status {sql:variable("@status")} 
       as first into (' + @Path + ')[1]') 
+0

प्रयास करें कि !! यह काम करता हैं!! [एक्सएमएल-डीएमएल के माध्यम से गतिशील एक्सएमएल नोड्स को संशोधित करना?] (Http://social.msdn.microsoft.com/Forums/en-US/sqlxml/thread/f7f211ee-df56-47a1-8365-4afa989416ff/) –

उत्तर

11

समस्या एसक्यूएल नहीं है के लिए किसी भी समाधान खोजने: मूल्य आप सम्मिलित करना कोशिश कर रहे हैं के साथ चर - जिस तरह से आप अपने संशोधित बयान में XPath शामिल है। आप कर सकते हैं स्ट्रिंग है कि आदेश नहीं एक साथ - आप का उपयोग करने की जरूरत है एक शाब्दिक:

SET @x.modify('insert attribute status {sql:variable("@status")} 
       as first into (/Parent/Node/)[1]') 

फिर यह बस ठीक काम करता है:

तो आप का उपयोग करने की आवश्यकता है।

+0

कोई भी संभावना एक गतिशील पथ का उपयोग ... पूर्ण पथ – sam

+0

@ सैम: नहीं, मुझे डर है, नहीं - कम से कम मैं कभी भी इसे काम करने में सक्षम नहीं हूं :-(SQL सर्वर 2008 के साथ आप निर्दिष्ट कर सकते हैं एक एसक्यूएल: वैल्यू डालने के लिए वैरिएबल - लेकिन उस पथ के लिए नहीं जहां डालना है –

2

आप इस तरह कुछ उपयोग कर सकते हैं - बस परिवर्तनीय भाग का उपयोग दिखा रहा है। एक ही बात आप आप इस

<Root> 
    <Elem1/> 
     <Parent1/> 
       <Separator/> 
        <Child1/> 
</Root> 
तरह पदानुक्रम है

क्वेरी मान लिया जाये कि संशोधित कॉल

के हिस्से के रूप कर सकते हैं: -

DECLARE @Root VARCHAR(50) 
DECLARE @Entity VARCHAR(50) 
DECLARE @ParentNode VARCHAR(50) 
DECLARE @Separator VARCHAR(50) 
DECLARE @ChildNode VARCHAR(50) 


SET @Root = 'Root' 
SET @Entity = 'Elem1' 
SET @ParentNode = 'Parent1' 
SET @Separator = 'separator' 
SET @ChildNode = 'Child1' 

select Parent.P.value('.', 'varchar(max)') as MyValue, 
T.uniqueId, T.XMLCol 
from [XMLTable] as T 
cross apply XMLTable.XMLCol.nodes('(/*[local-name()=sql:variable("@Root")]/*[local-name(.)=sql:variable("@Entity")]/*[local-name(.)=sql:variable("@ParentNode")]/*[local-name(.)=sql:variable("@Separator")]/*[local-name(.)=sql:variable("@ChildNode")])[1]') as Parent(P)