2010-04-13 7 views
7

Próbowanie następującego kodu. Ale pobieranie "Argument 1 metody typu danych XML" modyfikuj "musi być literałem" błąd ". Szukano dużo, ale nie mogę znaleźć żadnego rozwiązania tego problemuUzyskiwanie "Argument 1 metody typu danych XML" modyfikuj "musi być literałem ciąg" podczas wstawiania atrybutu w xml

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

Spróbuj tego !! To działa!! [Wstawianie dynamicznych węzłów XML za pomocą modyfikacji XML-DML?] (Http://social.msdn.microsoft.com/Forums/en-US/sqlxml/thread/f7f211ee-df56-47a1-8365-4afa989416ff/) –

Odpowiedz

11

Problemem nie jest SQL: Zmienna z wartością, którą próbujesz wstawić - to sposób obejmuje XPath do swojej zmodyfikować oświadczenia. Nie można dowodzić, że ciąg razem - trzeba użyć dosłownym:

Więc trzeba użyć:

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

Wtedy to działa dobrze.

+0

Wszelkie możliwości za pomocą ścieżki dynamicznej ... zamiast podania absolutnej ścieżki – sam

+0

@Sam: nie, obawiam się, nie - przynajmniej nigdy nie byłem w stanie go uruchomić :-(Z SQL Server 2008 można określić sql: zmienna dla wartości do wstawienia - ale nie dla ścieżki do wstawienia –

2

Możesz użyć czegoś takiego - pokazując użycie zmiennej części. To samo można zrobić w ramach zmodyfikować połączenia

Zakładając, że mamy hierarchię jak ten

<Root> 
    <Elem1/> 
     <Parent1/> 
       <Separator/> 
        <Child1/> 
</Root> 

Zapytanie: -

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)