2010-04-13 39 views
7

Intentando el siguiente código. Pero obtener 'El argumento 1 del método de tipo de datos xml "modificar" debe ser un error literal de cadena'. buscado mucho, pero no puedo encontrar ninguna solución para este problemaCómo obtener 'El argumento 1 del método de tipo de datos xml "modificar" debe ser un literal de cadena' al insertar un atributo en xml

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

Trate de que !! ¡¡Funciona!! [Insertar nodos dinámicos XML a través de XML-DML modify?] (Http://social.msdn.microsoft.com/Forums/en-US/sqlxml/thread/f7f211ee-df56-47a1-8365-4afa989416ff/) –

Respuesta

11

El problema no es el sql: variable con el valor que está tratando de insertar - que es la forma de incluir el XPath en su declaración de modificación. No se puede hilvanar ese comando - es necesario utilizar un literal:

Así que hay que utilizar:

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

entonces funciona muy bien.

+0

Cualquier posibilidad de utilizando una ruta dinámica ... en lugar de dar la ruta absoluta – sam

+0

@Sam: no, me temo, no, al menos no he podido hacer que funcione :-(Con SQL Server 2008 puede especificar una sql: variable para el valor a insertar, pero no para la ruta donde insertar –

2

Puede usar algo como esto - Solo se muestra el uso de la parte variable. Lo mismo se puede hacer como parte de la llamada Modificar

Asumiendo que tiene jerarquía como esto

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

Consulta: -

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) 
Cuestiones relacionadas