带有OPENXML的SQL UPDATE表

时间:2016-11-23 07:39:18

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

我想在下面的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

2 个答案:

答案 0 :(得分:0)

我不确切地知道您尝试做什么UPDATE,但我相信这会匹配someTablecontentReference表格中的记录,从XML中更新表中的messageAcceptanceCodemessageStatusCode值:

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的结构以及理想情况下两者的示例数据都会很方便。

答案 1 :(得分:0)

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

注意:

首先使用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的例子,几乎不可能提出一些建议。