Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Need help! Select from @xml ...  [new]
RubinDm
Member

Откуда:
Сообщений: 461
на входе:
declare @txt nvarchar(max) = '
<Rows>
<Row Offset="1" A1="V11" A2="V12"          />
<Row Offset="2"          A2="V22" A3="V23"  />
<Row Offset="3" A1="V31"          A3="V33"  />
</Rows>
';
declare @xml xml = @txt;

на выходе надо получить Select from @xml вида
OffsetKeyVal
1A1V11
1A2V12
2A2V22
2A3V23
3A1V31
3A3V33

собсно как это сделать?
4 июл 13, 15:13    [14522822]     Ответить | Цитировать Сообщить модератору
 Re: Need help! Select from @xml ...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
RubinDm, мой вариант:

select T2.Loc.value('@Offset', 'int') as Offset, 'A1' as [Key], T2.Loc.value('@A1', 'nvarchar(10)') as Val
from @xml.nodes('/Rows/Row') as T2(Loc)
where T2.Loc.value('@A1', 'nvarchar(10)') is not null
union all
select T2.Loc.value('@Offset', 'int') as Offset, 'A2' as [Key], T2.Loc.value('@A2', 'nvarchar(10)') as Val
from @xml.nodes('/Rows/Row') as T2(Loc)
where T2.Loc.value('@A2', 'nvarchar(10)') is not null
union all
select T2.Loc.value('@Offset', 'int') as Offset, 'A3' as [Key], T2.Loc.value('@A3', 'nvarchar(10)') as Val
from @xml.nodes('/Rows/Row') as T2(Loc)
where T2.Loc.value('@A3', 'nvarchar(10)') is not null


Еще возможен вариант вытащить все в одном запросе, и потом делать UNPIVOT.

Если количество атрибутов неизвестно - то превратить один из вариантов в динамический SQL.
4 июл 13, 15:24    [14522914]     Ответить | Цитировать Сообщить модератору
 Re: Need help! Select from @xml ...  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
DECLARE @XML XML = '<Rows>
<Row Offset="1" A1="V11" A2="V12"          />
<Row Offset="2"          A2="V22" A3="V23"  />
<Row Offset="3" A1="V31"          A3="V33"  />
</Rows>';

SELECT	T.*
FROM		@XML.nodes('/Rows/Row')	R(X)
CROSS APPLY	R.X .nodes('@*')	A(X)
CROSS APPLY (	SELECT
	 R.X.value('@Offset'		,'Int')
	,A.X.value('local-name(.)'	,'VarChar(50)')
	,A.X.value('.'			,'VarChar(50)')
				)	T(Offset,[Key],[Val])
WHERE	T.[Key] LIKE 'A%' -- != 'Offset'
4 июл 13, 15:35    [14523012]     Ответить | Цитировать Сообщить модератору
 Re: Need help! Select from @xml ...  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Mnior, спасибо, ровно то что надо!
closed
4 июл 13, 15:55    [14523193]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить