【问题标题】:Getting XQuery [modify()]: Top-level attribute nodes are not supported error while modifying xml获取 XQuery [modify()]: 修改 xml 时不支持顶级属性节点错误
【发布时间】:2011-02-06 04:28:33
【问题描述】:
DECLARE @mycur CURSOR
DECLARE @id int
DECLARE @ParentNodeName varchar(max)
DECLARE @NodeName varchar(max)
DECLARE @NodeText varchar(max)

SET @mycur = CURSOR
FOR
SELECT * FROM @temp

OPEN @mycur

FETCH NEXT FROM @mycur INTO @id,@ParentNodeName,@NodeName,@NodeText

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @id -- sample statements
PRINT  @ParentNodeName
PRINT  @NodeName
        SET @x.modify
        ('
            insert attribute status {sql:variable("@status")}
            as first
            into (/@ParentNodeName/@NodeName/child::*[position()=sql:variable("@status")])[1] 
        ')
FETCH NEXT FROM @mycur INTO  @id,@ParentNodeName,@NodeName,@NodeText
END

DEALLOCATE @mycur

知道为什么我会收到此错误,因为如果我手动插入路径,查询工作正常

【问题讨论】:

  • @status 是什么类型和值?这在您的样本中的任何地方都看不到....

标签: xml sql-server-2005 tsql


【解决方案1】:

问题在于@ParentNodeName 和@NodeName; @ 符号用于引用 SQL 中的变量,但它引用 XML 中的属性。 .modify() 方法试图在根部插入一行,其中包含一个属性链,这是一种格式很差的 SQL,当您看起来像是在尝试构建一个动态 XML 文档时。您需要构建一个动态 SQL 语句,将 @ParentNodeName 和 @NodeName 的值替换为您的临时表中的值,例如:

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

SET @SQL = REPLACE(@SQL, '@ParentNodeName', @ParentNodeName)
SET @SQL = REPLACE(@SQL, '@NodeName', NodeName)

EXEC (@SQL)

未经测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多