簡體   English   中英

將 XML 節點值轉換為 SQL 中的逗號分隔值

[英]Converting XML node values to comma separated values in SQL

我正在嘗試將 XML 節點值轉換為逗號分隔值,但是得到了

關鍵字“SELECT”附近的語法不正確。 錯誤信息

declare @dataCodes XML = '<Root>
                    <List Value="120" />
                    <List Value="110" />
                </Root>';

DECLARE   @ConcatString VARCHAR(MAX)
SELECT   @ConcatString = COALESCE(@ConcatString + ', ', '') + Code FROM (SELECT T.Item.value('@Value[1]','VARCHAR(MAX)') as Code  FROM  @dataCodes.nodes('/Root/List') AS T(Item))
SELECT   @ConcatString AS Result
GO

我試圖關注一篇文章,但不確定如何繼續。 任何建議表示贊賞。

期待:

逗號分隔值 ('120,110') 存儲在變量中。

嘗試這個;

DECLARE @dataCodes XML = '<Root>
                    <List Value="120" />
                    <List Value="110" />
                </Root>';      

DECLARE @ConcatString VARCHAR(MAX)

SELECT @ConcatString = COALESCE(@ConcatString + ', ', '') + Code
FROM (
    SELECT T.Item.value('@Value[1]', 'VARCHAR(MAX)') AS Code
    FROM @dataCodes.nodes('/Root/List') AS T(Item)
    ) as TBL

SELECT @ConcatString AS Result
GO

您只需要向您的子SQL查詢添加別名。

對於將來的讀者,可以使用通用語言將XML數據提取到數組,列表,向量和變量中,以逗號分隔的值輸出,更加流暢。 以下是利用OP的需求利用XPath的開源解決方案。

蟒蛇

import lxml.etree as ET

xml = '<Root>\
         <List Value="120" />\
         <List Value="110" />\
       </Root>'

dom = ET.fromstring(xml)
nodes = dom.xpath('//List/@Value')

data = []  # LIST
for elem in nodes:
    data.append(elem)

print((", ").join(data))

120, 110

PHP

$xml = '<Root>
         <List Value="120" />
         <List Value="110" />
       </Root>';

$dom = simplexml_load_string($xml);    
$node = $dom->xpath('//List/@Value');

$data = [];   # Array
foreach ($node as $n){  
     $data[] = $n; 
}

echo implode(", ", $data);

120, 110

[R

library(XML)

xml = '<Root>
         <List Value="120" />
         <List Value="110" />
       </Root>'

doc<-xmlInternalTreeParse(xml)    
data <- xpathSApply(doc, "//List", xmlGetAttr, 'Value')  # LIST

print(paste(data, collapse = ', '))

120, 110

要在沒有變量的情況下執行此操作,您可以使用nodes方法將 xml 節點轉換為帶有前導逗號的表格格式,然后使用FOR XML PATH('')將其折疊為一行 XML,然后將其包裝在STUFF中將其轉換為 varchar 並去掉開頭的前導逗號:

DECLARE @dataCodes XML = '<Root>
                <List Value="120" />
                <List Value="110" />
            </Root>';      
            
SELECT STUFF(
    (
    SELECT ', ' + T.Item.value('@Value[1]', 'VARCHAR(MAX)')
        FROM @dataCodes.nodes('/Root/List') AS T(Item)
        FOR XML PATH('')
    ), 1, 2, '')

暫無
暫無

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

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