在xml中插入属性时,获取“xml数据类型方法的参数1”修改“必须是字符串文字”

时间:2010-04-13 08:24:49

标签: xml tsql dynamic-sql

尝试以下代码。但是获取'xml数据类型方法的参数1“修改”必须是字符串文字'错误。搜索了很多,但无法找到解决此问题的任何方法

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

2 个答案:

答案 0 :(得分:11)

问题不在于sql:变量,而是您尝试插入的值 - 这是将XPath包含在修改语句中的方式。你不能把这个命令串在一起 - 你需要使用文字:

所以你需要使用:

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

然后它工作得很好。

答案 1 :(得分:2)

你可以使用这样的东西 - 只显示变量部分的用法。作为修改调用的一部分,您可以做同样的事情

假设您有这样的层次结构

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

查询: -

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) 
相关问题