1

收到了 xml 文件,我从中得到了发货人的框架。然后我生成一个答案 xml,我想在其中使用源 xml 中的一些块。这就是为什么我尝试将作为 xml 实例的“consignor”变量插入另一个 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
4

2 回答 2

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;

该表已经在您的代码中,只是未使用:)

于 2018-02-21T12:39:49.753 回答
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类似的别名来完成。否则你会反复得到你的命名空间声明(没有错,但很烦人!)。

如果您需要包含命名空间dtbs添加它们。但是这里没有使用它们......

;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>
于 2018-02-22T10:07:50.213 回答