收到xml文件,我从中获得发货人的框架。 然后我生成一个答案xml,我想在源xml中使用一些块。这就是为什么我试图插入"发货人"变量,它是另一个xml实例中的xml实例。 没有错误,但是,它没有插入值... 什么可能是错的?
DECLARE @source_vsd xml,
@output_vsd xml
SELECT @source_vsd = N'<vd:vetDocument xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<vd:certifiedConsignment xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<vd:consignor xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<dt:businessEntity xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">
<bs:uuid xmlns:bs="http://api.vetrf.ru/schema/cdm/base">04ceb142-053d-11e1-99b4-d8d385fbc9e8</bs:uuid>
</dt:businessEntity>
</vd:consignor>
<vd:consignee xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<dt:businessEntity xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">
<bs:uuid xmlns:bs="http://api.vetrf.ru/schema/cdm/base">cbee869d-5405-4181-a1d8-7e8c8af4597b</bs:uuid>
</dt:businessEntity>
</vd:consignee>
</vd:certifiedConsignment>
</vd:vetDocument>
'
DECLARE @consignee xml,
@consignor xml
DECLARE @t table(output_vsd_xml xml)
;WITH XMLNAMESPACES( 'http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2' as merc,
'http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2' as vd,
'http://api.vetrf.ru/schema/cdm/dictionary/v2' as dt,
'http://api.vetrf.ru/schema/cdm/base' as bs)
SELECT
@consignee = T.C.query('./vd:consignee[1]'),
@consignor = T.C.query('./vd:consignor[1]')
FROM @source_vsd.nodes('/vd:vetDocument/vd:certifiedConsignment') T(C)
DECLARE @szLocalTransactionId nvarchar(max),
@szLogin nvarchar(max),
@szDeliveryDate nvarchar(max)
SELECT @szLocalTransactionId = N'q1234',
@szLogin = N'login',
@szDeliveryDate = N'2015-09-28T17:17:00:00';
;WITH XMLNAMESPACES( 'http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2' as merc,
'http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2' as vd,
'http://api.vetrf.ru/schema/cdm/dictionary/v2' as dt,
'http://api.vetrf.ru/schema/cdm/base' as bs)
SELECT @output_vsd = (
SELECT @szLocalTransactionId as 'merc:localTransactionId',
(SELECT @szLogin as 'vd:login' FOR XML PATH ('merc:initiator'), ELEMENTS, TYPE),
(SELECT @szDeliveryDate as 'vd:deliveryDate' FOR XML PATH ('merc:delivery'), ELEMENTS, TYPE)
FOR XML PATH ('merc:processIncomingConsignmentRequest')
)
SELECT @output_vsd as without_inserted_value
select @consignor as inserted_value
SET @output_vsd.modify('
declare namespace merc="http=api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2";
declare namespace vd="http=api.vetrf.ru/schema/cdm/mercury/vet-document/v2";
declare namespace dt="http=api.vetrf.ru/schema/cdm/dictionary/v2";
declare namespace bs="http=api.vetrf.ru/schema/cdm/base";
insert sql:variable("@consignor")
into (/merc:processIncomingConsignmentRequest/merc:delivery/vd:deliveryDate)[1]')
SELECT @output_vsd as with_inserted_value
答案 0 :(得分:0)
显然,更新XML变量存在一些问题,因为只要将值放入表中(并将名称空间移动到with namespaces()
部分),一切就会开始按原样运行:
insert into @t (output_vsd_xml)
values (@output_vsd);
WITH XMLNAMESPACES (
'http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2' as merc,
'http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2' as vd,
'http://api.vetrf.ru/schema/cdm/dictionary/v2' as dt,
'http://api.vetrf.ru/schema/cdm/base' as bs
)
update t set output_vsd_xml.modify('
insert sql:variable("@consignor")
as first into /merc:processIncomingConsignmentRequest[1]/merc:delivery[1]/vd:deliveryDate[1]'
)
from @t t;
select * from @t;
该表已经在您的代码中,只是未使用过:)
答案 1 :(得分:0)
很遗憾,你没有说明你的预期输出,所以我的答案需要一些神奇的晶球请求。我很确定,这可以更容易解决:
DECLARE @output_vsd XML;
DECLARE @source_vsd XML =
N'<vd:vetDocument xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<vd:certifiedConsignment xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<vd:consignor xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<dt:businessEntity xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">
<bs:uuid xmlns:bs="http://api.vetrf.ru/schema/cdm/base">04ceb142-053d-11e1-99b4-d8d385fbc9e8</bs:uuid>
</dt:businessEntity>
</vd:consignor>
<vd:consignee xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<dt:businessEntity xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">
<bs:uuid xmlns:bs="http://api.vetrf.ru/schema/cdm/base">cbee869d-5405-4181-a1d8-7e8c8af4597b</bs:uuid>
</dt:businessEntity>
</vd:consignee>
</vd:certifiedConsignment>
</vd:vetDocument>';
- easy-cheesy ,我使用名称空间通配符和深度搜索和//
DECLARE @consignor xml = @source_vsd.query(N'//*:consignor[1]');
DECLARE @szLocalTransactionId nvarchar(max)= N'q1234';
DECLARE @szLogin nvarchar(max) = N'login';
DECLARE @szDeliveryDate nvarchar(max) = N'2015-09-28T17:17:00:00';
- 您可以在XML的一代中直接添加XML。不需要表格或任何.modify()
的电话 - 至少我是这么认为的。不需要子选择,只需添加更深的嵌套。这可以使用XPath
之类的别名来完成。否则你会反复得到你的命名空间声明(没错,但非常讨厌!)。
如果您需要添加名称空间dt
和bs
,只需添加它们即可。但是这里没有使用它们......
;WITH XMLNAMESPACES( 'http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2' as merc,
'http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2' as vd)
SELECT @output_vsd =
(
SELECT @szLocalTransactionId as [merc:localTransactionId],
@szLogin as [merc:initiator/vd:login],
@szDeliveryDate as [merc:delivery/vd:deliveryDate],
@consignor as [merc:delivery/*]
FOR XML PATH ('merc:processIncomingConsignmentRequest')
);
SELECT @output_vsd;
我不知道,发货人在哪里。这是我的输出:
<merc:processIncomingConsignmentRequest xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2" xmlns:merc="http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2">
<merc:localTransactionId>q1234</merc:localTransactionId>
<merc:initiator>
<vd:login>login</vd:login>
</merc:initiator>
<merc:delivery>
<vd:deliveryDate>2015-09-28T17:17:00:00</vd:deliveryDate>
<vd:consignor xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
<dt:businessEntity xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">
<bs:uuid xmlns:bs="http://api.vetrf.ru/schema/cdm/base">04ceb142-053d-11e1-99b4-d8d385fbc9e8</bs:uuid>
</dt:businessEntity>
</vd:consignor>
</merc:delivery>
</merc:processIncomingConsignmentRequest>