[英]XML Parse in T-SQL
我正在嘗試在 T-SQL 中解析 XML 文檔。 當有一些客戶端時,XML 文檔看起來像:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfServerSettings>
<ServerSettings>
<Address>10.0.1.1</Address>
<Nodes>
<NodeSettings>
<PortNumber>5000</PortNumber>
<ClientIds>
<int>1</int>
<int>2</int>
<int>3</int>
</ClientIds>
</NodeSettings>
</Nodes>
</ServerSettings>
</ArrayOfServerSettings>
如果沒有任何客戶,它看起來像
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfServerSettings>
<ServerSettings>
<Address>10.0.1.1</Address>
<Nodes>
<NodeSettings>
<PortNumber>5000</PortNumber>
<ClientIds />
</NodeSettings>
</Nodes>
</ServerSettings>
</ArrayOfServerSettings>
在第一種情況下,表格應如下所示
Address PortNumber ClientId
10.0.1.1 5000 1
10.0.1.1 5000 2
10.0.1.1 5000 3
當沒有客戶端時,我應該像這樣解析它們
Address PortNumber ClientId
10.0.1.1 5000 0
這是我的 t-sql 語句
declare @xml XML
set @xml = N'<?xml version="1.0" encoding="utf-16"?>
<ArrayOfCalculationServerSettings>
<CalculationServerSettings>
<Address>10.0.1.1</Address>
<Nodes>
<NodeSettings>
<PortNumber>10009</PortNumber>
<ClientIds>
<int>1</int>
<int>2</int>
<int>3</int>
</ClientIds>
</NodeSettings>
</Nodes>
</CalculationServerSettings>
'
DECLARE @DocID INT
EXEC sp_xml_preparedocument @DocID OUTPUT, @xml
SELECT *
FROM
OPENXML(@DocID, '/ArrayOfServerSettings/ServerSettings/Nodes/NodeSettings/ClientIds/int', 1)
WITH (
Address NVARCHAR(256) '../../../../Address[1]',
PortNumber INT '../../PortNumber[1]',
ClientID INT '.'
) AS D0
EXEC sp_xml_removedocument @DocID
但我的方法不適用於第二種選擇
如果我們可以假設您有有效的 XML(您的不是),並且您只有 1 個 PortNumber 節點,您可以這樣做:
declare @xml XML
set @xml = N'<?xml version="1.0" encoding="utf-16"?>
<ArrayOfCalculationServerSettings>
<CalculationServerSettings>
<Address>10.0.1.1</Address>
<Nodes>
<NodeSettings>
<PortNumber>10009</PortNumber>
<ClientIds>
<int>1</int>
<int>2</int>
<int>3</int>
</ClientIds>
</NodeSettings>
</Nodes>
</CalculationServerSettings>
</ArrayOfCalculationServerSettings>'; --This is missing in your XML
SELECT ACSS.CSS.value('(Address/text())[1]','nvarchar(15)') AS Address,
ACSS.CSS.value('(Nodes/NodeSettings/PortNumber/text())[1]','int') AS PortNumber, --I assume always the same port number
ISNULL(CS.I.value('text()[1]','int'),0) AS int
FROM @xml.nodes('ArrayOfCalculationServerSettings/CalculationServerSettings') ACSS(CSS)
OUTER APPLY ACSS.CSS.nodes('Nodes/NodeSettings/ClientIds/int')CS(I);
如果您有多個端口號,並且具有更多int
值,那么您需要對nodes
方法進行一些進一步的嵌套。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.