2010-04-13 13 views
7

Essayer le code suivant. Mais obtenir 'L'argument 1 de la méthode de type de données xml "modifier" doit être une erreur littérale ". recherché beaucoup, mais ne peux pas trouver une solution à ce problèmeObtention 'L'argument 1 de la méthode de type de données xml "modify" doit être une chaîne littérale' lors de l'insertion d'un attribut dans xml

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

Essayez ça !! Ça marche!! [Insérer des nœuds XML dynamiques via une modification XML-DML?] (Http://social.msdn.microsoft.com/Forums/en-US/sqlxml/thread/f7f211ee-df56-47a1-8365-4afa989416ff/) –

Répondre

11

Le problème est pas sql: variable avec la valeur que vous essayez d'insérer - c'est la façon d'inclure le XPath dans votre déclaration modify. Vous ne pouvez pas enchaîner cette commande - vous devez utiliser un littéral:

Vous devez utiliser:

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

Ensuite, il fonctionne très bien.

+0

Toute possibilité de en utilisant un chemin dynamique ... au lieu de donner le chemin absolu – sam

+0

@Sam: non, j'ai peur, non - au moins je n'ai jamais pu le faire fonctionner :-(Avec SQL Server 2008, vous pouvez spécifier un sql: variable pour la valeur à insérer - mais pas pour le chemin où insérer à –

2

Vous pouvez utiliser quelque chose comme ceci - Montrant juste l'utilisation de partie variable. Même chose que vous pouvez faire dans le cadre de l'appel modify

En supposant que vous avez hiérarchie comme ce

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

Requête: -

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)