【问题标题】:SQL UPDATE table with OPENXML带有 OPENXML 的 SQL UPDATE 表
【发布时间】:2017-04-07 02:46:21
【问题描述】:

我想在以下 OPENXML 语句中更新一个表,但不知道将语法作为 UPDATE、FROM 和 WHERE 放在哪里。

我使用 OPENXML 语句得到了一个不错的结果集,但是如何使用它更新表?

DECLARE @x xml

SELECT @x=R
FROM OPENROWSET (BULK 'C:\Users\ronal\Dropbox\Projecten\Voormelden Portbase\20161021095457591.xml', SINGLE_BLOB) AS XMLPortbase(R)

DECLARE @hdoc int
EXEC sp_xml_preparedocument @hdoc OUTPUT, @x


    UPDATE [COMTECdefault].[dbo].[voormelden] 
SET 
    Tarcode = '12345678'

FROM OPENXML (@hdoc, '/StandardBusinessDocument/documentContent/contentBody/Acknowledgement/messageStatus',3)
WITH (
        previousContentReference varchar(50) '../../../previousContentHeader/contentReference',
        messageAcceptanceCode varchar(50) '../messageAcceptanceCode',
        timeslotReference varchar(50) '../timeslotReference',
        offeredArrivalDateTime DateTime '../offeredArrivalDateTime',
        offeredDepartureDateTime DateTime '../offeredDepartureDateTime',
        messageStatusCode varchar(255),
        messageStatusDescription varchar(255),
        additionalStatusRemarks varchar(255),
        containerPrefixAndNumber varchar(50) '../containerPrefixAndNumber'
    )
WHERE ID = previousContentReference

EXEC sp_xml_removedocument @hdoc

【问题讨论】:

  • FROM OPENXML 附带的准备和删除文档的程序已过时。最好使用 real XML 方法 .value().nodes()query().exist().modify()。请发布您的 XML 的(简化)示例以帮助您。
  • 嗨罗纳德!由于您是新来的(顺便说一句:欢迎!)请给我一个提示:这个问题解决了吗?您需要进一步的帮助吗?请给我一个提示:如果这个问题得到了解决,您将非常好心,在(最佳)答案的投票计数器下方勾选接受检查。这将 1) 将此问题标记为已解决 2) 让追随者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。一旦您自己越过了 15 点边界,您还被要求对贡献进行投票。这是说谢谢的方式。编码快乐!

标签: sql sql-server xml tsql sql-server-2012


【解决方案1】:

我的魔法玻璃灯泡告诉我你想要达到这样的目标:

注意:

首先尝试使用SELECT 而不是UPDATE ... SET(并删除YourTable. 以获得正确的列别名)!

UPDATE YourTable
SET YourTable.ContentReference     =nd.value(N'(../../../contentHeader/contentReference)[1]',N'varchar(50)')
   ,YourTable.MessageAcceptanceCode=nd.value(N'(../messageAcceptanceCode)[1]',N'varchar(50)')
   ,YourTable.MessageStatusCode    =nd.value(N'.',N'varchar(255)')
FROM @x.nodes(N'/StandardBusinessDocument/documentContent/contentBody/Acknowledgement/messageStatus') AS A(nd)

如果性能很重要,这个../../../ 非常慢。但是如果没有您的 XML 示例,就几乎不可能提出建议。

【讨论】:

    【解决方案2】:

    我不确切知道您要执行哪种UPDATE,但我相信这将匹配contentReferencesomeTable 表中的记录并更新messageAcceptanceCodemessageStatusCode 值在来自 XML 的表中:

    UPDATE someTable
    SET someTable.messageAcceptanceCode = XMLdata.messageAcceptanceCode,
        someTable.messageStatusCode = XMLdata.messageStatusCode
    FROM OPENXML (@hdoc, '/StandardBusinessDocument/documentContent/contentBody/Acknowledgement/messageStatus',3)
    WITH (
            contentReference VARCHAR(50) '../../../contentHeader/contentReference',
            messageAcceptanceCode VARCHAR(50) '../messageAcceptanceCode',
            messageStatusCode VARCHAR(255)
    
        ) XMLdata
    WHERE someTable.contentReference = XMLdata.contentReference
    

    如果您需要更详细的答案,最好准备好要更新的表的架构、XML 的结构以及理想情况下两者的示例数据。

    【讨论】:

    • 您好,首先感谢您的回复。我已经接受了 WHERE 子句。好像没什么价值。
    • 您好,首先感谢您的回复。我已经接受了 WHERE 子句。它似乎没有任何价值。我确定de xml中有一个值。如果我在没有 UPDATE 语句的情况下检查结果集,我可以看到该值。我究竟做错了什么? .... WHERE ID = ContentReference
    • 您能否提供您的 XML 文件和表格中的示例数据来帮助解决此问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多