Таблица SQL Server в XML - PullRequest
       1

Таблица SQL Server в XML

2 голосов
/ 09 февраля 2010

на этот раз у меня есть вопрос, как преобразовать таблицу MSSQL в XML

Моя исходная таблица SQL:

+-----------+-----------------+
|atributname|atributvalue     |
+-----------+-----------------+
|phone      |222              |
|param4     |bbbbcdsfceecc    |
|param3     |bbbbcdsfceecc    |
|param2     |bbbbcdsfccc      |
+-----------+-----------------+

Пример ожидаемого результата:

<items>
<phone>222</phone>
<prama4>bbbbcdsfceecc</param4>
<param3>bbbbcdsfceecc</param3>
<param2>bbbbcdsfccc</param2>
</items>

Я перепробовал множество вариантов следующего запроса

SELECT atributname,atributvalue  
FROM sampletable FOR XML PATH (''), ROOT ('items');

но результаты не очень хороши :( должно быть точно так же, как в «Образце ожидаемого результата»

любая помощь

пс Скрипт для создания образца таблицы:

create table sampletable
(atributname varchar(20),
atributvalue varchar(20))


insert into  sampletable (atributname,atributvalue) 
values ('phone','222');

insert into  sampletable (atributname,atributvalue) 
values ('param4','bbbbcdsfceecc');

insert into  sampletable (atributname,atributvalue) 
values ('param3','bbbbcdsfceecc');

insert into  sampletable (atributname,atributvalue) 
values ('param2','bbbbcdsfccc');

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Это не так, как FOR XML работает. Это столбцы , которые превращаются в элементы XML, а не в строки. Чтобы получить ожидаемый результат, вам нужно иметь столбцы с именами phone, param4 и т. Д., А не строки с этими значениями в attributename.

Если есть определенные элементы, которые вы хотите в XML, вы можете сначала выполнить разворот данных, а затем использовать FOR XML.

Примером пивота будет:

SELECT [phone], [param2], [param3], [param4]
FROM
(
    SELECT attributename, attributevalue
    FROM attributes
) a
PIVOT
(
    MAX(attributevalue)
    FOR attributename IN ([phone], [param2], [param3], [param4])
) AS pvt
FOR XML ROOT('items')

Конечно, агрегат будет работать, только если attributevalue - это числовой тип данных. Если это столбец символьного типа, у вас возникнут некоторые проблемы с осью, поскольку в SQL-сервере нет встроенных агрегатов строк AFAIK ...

0 голосов
/ 09 февраля 2010

ки наконец я сделал это несколькими способами,
но это самая простая версия, подходящая для набора средних данных

declare @item  nvarchar(max)

set @item= (SELECT '<' + atributname +'>' +
            cast(atributvalue as nvarchar(max)) +'</' + atributname +'>'
            FROM sampletable FOR XML PATH (''), ROOT ('items'));

select replace(replace(@item,'&lt;','<'),'&gt;','>')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...