获得';xml数据类型方法的参数1;修改";必须是字符串文字';在xml中插入属性时

获得';xml数据类型方法的参数1;修改";必须是字符串文字';在xml中插入属性时,xml,tsql,dynamic-sql,Xml,Tsql,Dynamic Sql,正在尝试以下代码。但是获取xml数据类型方法“modify”的参数1必须是字符串文字错误。搜索了很多,但找不到这个问题的任何解决方案 SET @Path = '/@ParentNodeName/@NodeName/child::*' SET @x.modify('insert attribute status {sql:variable("@status")} as first into (' + @Path + ')[1]') 问题不在于您试图插入的sql:变量

正在尝试以下代码。但是获取xml数据类型方法“modify”的参数1必须是字符串文字错误。搜索了很多,但找不到这个问题的任何解决方案

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

问题不在于您试图插入的sql:变量的值,而在于您将XPath包含到modify语句中的方式。不能将该命令串在一起-需要使用文字:

因此,您需要使用:

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

那么它就可以正常工作了

您可以使用类似的方法—只显示变量部分的用法。作为修改调用的一部分,可以执行相同的操作

假设你有这样的层次结构

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

使用动态路径而不是给出绝对值的任何可能性path@Sam:不,恐怕不行-至少我还没能让它工作:-(使用SQL Server 2008,您可以为要插入的值指定一个SQL:变量-但不能为插入的路径指定该变量!!它可以工作!!
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)