【问题标题】:Getting 'The argument 1 of the xml data type method "modify" must be a string literal' while inserting a attribute in xml在xml中插入属性时获取'xml数据类型方法“修改”的参数1必须是字符串文字'
【发布时间】:2011-02-07 08:27:18
【问题描述】:

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

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

【问题讨论】:

标签: xml tsql dynamic-sql


【解决方案1】:

你可以使用这样的东西 - 只是显示可变部分的用法。作为修改调用的一部分,您可以执行相同的操作

假设你有这样的层次结构

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

【讨论】:

    【解决方案2】:

    问题不在于 sql:variable 与您尝试插入的值 - 这是您将 XPath 包含到修改语句中的方式。您不能将该命令串在一起 - 您需要使用文字:

    所以你需要使用:

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

    然后它工作得很好。

    【讨论】:

    • 任何使用动态路径的可能性...而不是给出绝对路径
    • @Sam: 不,恐怕不是 - 至少我无法让它工作:-( 使用 SQL Server 2008,您可以为要插入的值 - 但不是要插入的路径
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2022-08-21
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多