我想在下面的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
答案 0 :(得分:0)
我不确切地知道您尝试做什么UPDATE
,但我相信这会匹配someTable
上contentReference
表格中的记录,从XML中更新表中的messageAcceptanceCode
和messageStatusCode
值:
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的例子,几乎不可能提出一些建议。