2010-04-13 11 views
7

Probieren Sie den folgenden Code. Aber bekommen 'Das Argument 1 der Xml-Datentyp-Methode "Ändern" muss ein String-Literal' Fehler sein. viel gesucht, aber kann nicht jede Lösung für dieses ProblemGetting 'Das Argument 1 der Xml-Datentyp-Methode "Ändern" muss ein String-Literal sein' beim Einfügen eines Attributs in Xml

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

bereiten !! Es klappt!! [Einfügen von dynamischen XML-Knoten über XML-DML modifizieren?] (Http://social.msdn.microsoft.com/Forums/en-US/sqlxml/thread/f7f211ee-df56-47a1-8365-4afa989416ff/) –

Antwort

11

Das Problem ist nicht die SQL finden: Variable mit dem Wert, den Sie versuchen, einzufügen - es ist die Art und Weise Sie die XPath in Ihre modify Erklärung enthalten. Sie können nicht aneinanderzureihen, die Befehl - Sie verwenden müssen, eine wörtliche:

So müssen Sie verwenden:

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

Dann funktioniert es ganz gut.

+0

Jede Möglichkeit von Verwenden Sie einen dynamischen Pfad ... anstatt den absoluten Pfad zu geben – sam

+0

@Sam: Nein, ich habe Angst, nicht - zumindest konnte ich es nie zum Laufen bringen :-(Mit SQL Server 2008 können Sie angeben a sql: Variable für den einzufügenden Wert - aber nicht für den Pfad, in den eingefügt werden soll –

2

Sie können so etwas verwenden - Nur die Verwendung von variablen Teil zeigen. Das Gleiche gilt für Sie als Teil modify Telefonieren

Angenommen, Sie haben Hierarchie wie diese

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

Abfrage: -

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) 
Verwandte Themen