[英]get comma separated values from xml data
我知道如何在最簡單的場景中做到這一點,例如
DECLARE @commaSeparatedValues NVARCHAR(MAX)
DECLARE @xml XML = N'<id>1</id>
<name>test</name>
<istest>1</istest>'
;WITH nodes AS
(
SELECT Tbl.Col.value('.', 'nvarchar(max)') as Value
FROM @xml.nodes('*/text()') Tbl(Col)
),
prepareStrings
AS
(
SELECT IIF(ISNUMERIC(n.value) = 1, n.Value, '''' + n.Value + '''') AS Value
FROM nodes n
)
SELECT @commaSeparatedValues = CASE WHEN @commaSeparatedValues IS NULL THEN s.Value ELSE @commaSeparatedValues + ',' + s.value END
FROM prepareStrings s
SELECT @commaSeparatedValues as csv
這非常有效。 當我想以這種方式解析以下xml數據時出現問題。 我在編寫正確的查詢時遇到問題。
DECLARE @xml XML = N'
<e>
<id>1</id>
<name>test</name>
<istest>1</istest>
</e>
<e>
<id>2</id>
<name>test2</name>
<istest>0</istest>
</e>
'
我可以通過使用逐行獲取元素
select Tbl.col.query('.') as [xml]
from @xml.nodes('e') Tbl(col)
我不知道的是如何向前推進。 不知道如何使用此查詢,現在查詢[xml]列。
請嘗試以下SQL查詢
DECLARE @commaSeparatedValues NVARCHAR(MAX)
DECLARE @xml XML = N'
<e>
<id>1</id>
<name>test1</name>
<istest>1</istest>
</e>
<e>
<id>2</id>
<name>test2</name>
<istest>2</istest>
</e>
'
;with cte as (
select
rownr = ROW_NUMBER() over (order by @commaSeparatedValues),
Tbl.col.query('.') as [xml]
from @xml.nodes('e') Tbl(col)
), cols as (
select
rownr,
Tbl.Col.value('.', 'nvarchar(max)') as Value
from cte
cross apply cte.xml.nodes('//text()') Tbl(Col)
)
select distinct
STUFF((
SELECT ',' + IIF(ISNUMERIC(value) = 1, Value, '''' + Value + '''')
FROM cols SSF WHERE SSF.rownr = S.rownr
FOR XML PATH(''),TYPE
).value('.','VARCHAR(MAX)'
), 1, 1, '')
from cols S
我使用SQL row_number()函數對記錄進行編號,並在將值分隔為值時區分列值(第二個CTE使用Partition By子句對行數據中的列進行排序)
然后我使用SQL字符串連接方法使用XML PATH()將字符串值連接成逗號分隔的字符串
我希望它有所幫助
你在找這樣的東西嗎?
DECLARE @xml XML = N'
<e>
<id>1</id>
<name>test</name>
<istest>1</istest>
</e>
<e>
<id>2</id>
<name>test2</name>
<istest>0</istest>
</e>'
SELECT
XC.value('(id)[1]', 'varchar(10)') + ',' +
XC.value('(name)[1]', 'varchar(100)') + ',' +
xc.value('(istest)[1]', 'varchar(10)')
FROM @Xml.nodes('/e') AS XT(XC)
這輸出:
1,test,1
2,test2,0
基本上, .nodes()
運算符將創建XML片段的“虛擬列表”(XML文檔中每個<e>
節點一個),然后為該虛擬表中的每一行選擇“到達”該XML片段並將用逗號分隔的各個部分連接成一個單獨的字符串
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.