簡體   English   中英

如何使用存儲過程轉換 XML 文本並插入 Microsoft SQL 服務器

[英]How to convert XML Text and insert into Microsoft SQL Server using a stored procedure

我有一個像這樣的 XML 文件:

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" 
               xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 
               xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <soap:Body>
        <Abc ">
            <Def>ID&gt;1&lt;/ID&gt;&lt;Number&gt;Not Available&lt;/Number&gt;&lt;AbcName&gt;Hello&lt;/AbcName&</Def>
        </Abc>
    </soap:Body>
</soap:Envelope>

我想編寫一個存儲過程,用於提取DEF標記內的文本並獲取 Id、abcname 等列數據並插入 SQL 服務器數據庫。

對此問題的任何幫助將不勝感激。

謝謝你!

<Def>的值提取為字符串,然后將其解析為 xml,因為 xml 沒有任何根節點,將添加一個節點,因此我們可以在 sql 服務器中使用 xml function 來獲取節點值。

declare @xmlstring varchar(max) 
declare @xml xml
set @xmlstring = N'<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" 
               xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 
               xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <soap:Body>
        <Abc xmlns=\"http://www.web.xds.co.za/XDSConnectWS\">
            <Def>&lt;ID&gt;1&lt;/ID&gt;&lt;Number&gt;Not Available&lt;/Number&gt;&lt;AbcName&gt;Hello&lt;/AbcName&gt;</Def>
        </Abc>
    </soap:Body>
</soap:Envelope>';

set @xmlstring = substring(@xmlstring, charindex('<Def>', @xmlstring)+5, charindex('</Def>', @xmlstring) - charindex('<Def>', @xmlstring) -5)

set @xml = concat('<root>', cast (@xmlstring as xml).value('.[1]','nvarchar(max)' ), '</root>');

select @xml;
select @xml.value('(/root/ID)[1]','varchar(30)') as ID
    ,  @xml.value('(/root/AbcName)[1]','varchar(30)') as [Name]

這里的問題是Def內部的 XML 節點沒有正確編碼。 它們作為內部文本存儲在節點內。 所以你需要把它拉出來並轉換它。

我們可以使用.valueCAST提取文本,在CROSS APPLY (VALUES .

您可以使用直接.value調用來執行此操作

DECLARE @xml xml = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <Abc xmlns="http://www.web.xds.co.za/XDSConnectWS">
            <Def>&lt;ID&gt;1&lt;/ID&gt;&lt;Number&gt;Not Available&lt;/Number&gt;&lt;AbcName&gt;Hello&lt;/AbcName&gt;</Def>
        </Abc>
    </soap:Body>
</soap:Envelope>';

WITH XMLNAMESPACES(
  'http://www.web.xds.co.za/XDSConnectWS' AS x,
  'http://www.w3.org/2003/05/soap-envelope' AS soap
)
SELECT
  v.InnerXml.value('(ID/text())[1]','int') as ID,
  v.InnerXml.value('(AbcName/text())[1]','varchar(30)') as Name,
  v.InnerXml.value('(Number/text())[1]','varchar(30)') as Number
FROM (VALUES(
    CAST(@xml.value('(soap:Envelope/soap:Body/x:Abc/x:Def/text())[1]','nvarchar(max)') AS xml)
)) v(InnerXml);

或者,如果您有多個節點要讀取,那么您可以通過.nodes提供它:

WITH XMLNAMESPACES(
  'http://www.web.xds.co.za/XDSConnectWS' AS x,
  'http://www.w3.org/2003/05/soap-envelope' AS soap
)
SELECT
  x2.n.value('(ID/text())[1]','int') as ID,
  x2.n.value('(AbcName/text())[1]','varchar(30)') as Name,
  x2.n.value('(Number/text())[1]','varchar(30)') as Number
FROM @xml.nodes('soap:Envelope/soap:Body/x:Abc/x:Def') x1(DEF)
CROSS APPLY (VALUES(
    CAST(N'<r>' + x1.DEF.value('text()[1]','nvarchar(max)') + '</r>' AS xml)
)) v(InnerXml)
CROSS APPLY v.InnerXml.nodes('r') x2(n);

db<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM