【问题标题】:Dynamic XML node name in SQL XMLSQL XML 中的动态 XML 节点名称
【发布时间】:2025-12-26 21:10:06
【问题描述】:

我正在使用临时表中列的值更新 XML 列。我可以如下更新表格。

UPDATE  tbWorkflow 
SET     xmlData.modify('insert 
                (<FromQueueName>
                <CustomerID>{ sql:column("T.iVTollCustID") }</CustomerID>
                <Date>{ sql:variable("@CurrDateTime") }</Date>
                </FromQueueName>)                           
                as first into (/configuration)[1]'),
        vcQueue             =   'qVtoll',
        dtUpdTime           =   GETDATE()
FROM    #Trxns    T 
WHERE   T.biWorkflowID      =   tbWorkflow.biWorkflowID   

但是,我希望节点名称是动态的(来自临时表),如下所示。但它不起作用。

UPDATE  tbWorkflow 
SET     xmlData.modify('insert 
                (<**{ sql:column("T.vcQueue") }**>
                <CustomerID>{ sql:column("T.iVTollCustID") }</CustomerID>
                <Date>{ sql:variable("@CurrDateTime") }</Date>
                </**{ sql:column("T.vcQueue") }**>)                         
                as first into (/configuration)[1]'),
        vcQueue             =   'qVtoll',
        dtUpdTime           =   GETDATE()
FROM    #Trxns    T 
WHERE   T.biWorkflowID      =   tbWorkflow.biWorkflowID

感谢任何帮助。

【问题讨论】:

  • 这是什么数据库? MySQL?后格雷斯? SQL 服务器?甲骨文? DB2?他们都使用 SQL - 但他们都做的事情略有不同 - 知道这是什么具体数据库对我们帮助您来说非常宝贵!请相应地更新您的标签

标签: sql xml sql-server-2008


【解决方案1】:

我认为,您应该使用子查询来选择您需要的字符串,然后将其插入 XML。 例如,在子查询中获取&lt;YourTag&gt;&lt;CustomerID&gt;123&lt;/CustomerID&gt;&lt;Date&gt;15.10.2012&lt;/Date&gt;&lt;/YourTag&gt;,然后您可以简单地将其插入 XML

【讨论】:

    【解决方案2】:

    我找到了解决方法。

    我在临时表中添加了另一个 VARCHAR 列,将 xml 节点创建为 varchar,然后使用此 varchar 列修改了我的实际 xml 列。

    UPDATE  #Trxns
    SET     xmlVarchar = '<' + vcQueue + '>
            <CustomerID>' + CONVERT(VARCHAR(10),iVTollCustID) + '</CustomerID>
            <Date>' + CONVERT(VARCHAR(25), GETDATE(),22) + '</Date>' +
            '</' + vcQueue + '>'
    
    
    UPDATE  tbWorkflow 
    SET     xmlData.modify('insert 
                    sql:column("xmlVarchar")
                    as first into (/configuration)[1]'),
            vcQueue             =   'qVtoll',
            dtUpdTime           =   GETDATE()
    FROM    #Trxns    T  
    WHERE   T.biWorkflowID      =   tbWorkflow.biWorkflowID 
    

    【讨论】: