2015-10-01 3 views
0

Я пытаюсь преобразовать значения узла XML для значений, разделенных запятой, но, получаяПреобразование значений XML узлов в значения, разделенные запятыми в SQL

Неправильный синтаксис около ключевого слова «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 

Я пытался следовать article, но не уверен, как действовать дальше. Любое предложение приветствуется.

Expectation:

разделенных запятыми значений ('120110'), который хранится в переменной.

+0

Конечно, вы можете использовать языки общего назначения, как VB, C#, C++, Java , П ython, PHP, который отлично обрабатывает преобразование данных плоских файлов (xml, csv, txt, json и т. д.), даже результат соединений RDMS. SQL является языком специального назначения и в первую очередь должен использоваться для взаимодействия с базами данных (поиск, манипуляция, определение). – Parfait

ответ

4

Попробуйте это;

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-запросу.

1

Для будущих читателей XML-данные могут быть извлечены из массивов, списков, векторов и переменных для вывода в значениях, разделенных запятыми, более гибко, используя языки общего назначения. Ниже представлены решения с открытым исходным кодом с использованием потребностей OP, используя XPath.

Python

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 
Смежные вопросы