![](/img/trans.png)
[英]Insert data in to table using xml and stored procedure in SQL Server 2008
[英]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>1</ID><Number>Not Available</Number><AbcName>Hello</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><ID>1</ID><Number>Not Available</Number><AbcName>Hello</AbcName></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 節點沒有正確編碼。 它們作為內部文本存儲在節點內。 所以你需要把它拉出來並轉換它。
我們可以使用.value
和CAST
提取文本,在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><ID>1</ID><Number>Not Available</Number><AbcName>Hello</AbcName></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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.