Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать все аттрибуты XML как отдельные значения  [new]
djpeter
Member

Откуда:
Сообщений: 33
Есть строки вида
<Fields><deleted ID="2" lTab="1332" INmbr="2" szDate="20111229" szTime="105216" lTaSeqNmbr="7" lTaRefToCreateNmbr="3" dD="0.0000" dK="60.0000" szAccountClass1="30112 " szAccountClass2="2610011 " szAccountClass3="1234 " szAccountClass4=" " szAccountClass5="4041 " szAccountClass6=" " szAccountClass7=" " szAccountClass8=" " szAccountClass9=" " szAccountClass10=" " szAccountClass11=" " szAccountClass12=" " szAccountClass13=" " szAccountClass14=" " szAccountClass15=" " szAccountClass16=" " szAccountClass17=" " szAccountClass18=" " szAccountClass19=" " szAccountClass20=" " bAutomaticallyDone="-1" szLastUpdLocal="20111229105535" szBase="ART_SALE" lSequenceNumber="1183" /></Fields>

<Fields><deleted lOID="1" lWPEC="0" lTechLayerAccessID="1" szLastUpdLocal="20111216100527" /></Fields>

И тд. Везде переменное число атрибутов с изменяющимися именами
Такой запрос

SELECT
xmlField.query('data(/Fields/deleted/@*)').value('.', 'varchar(80)') as Value

FROM [DBName].[dbo].[DbTable]

WHERE xmlField IS NOT NULL

Выдает все значения в строку.
Как сделать так, чтобы запрос проходил по всем строкам и выдавал каждое значение атрибута как отдельный результат?
11 янв 12, 17:24    [11887213]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
user89
Member

Откуда:
Сообщений: 2083
djpeter,
???
declare @t table (xmlField xml)
insert @t
select '<Fields><deleted ID="2" lTab="1332" INmbr="2" szDate="20111229" szTime="105216" lTaSeqNmbr="7" lTaRefToCreateNmbr="3" dD="0.0000" dK="60.0000" szAccountClass1="30112 " szAccountClass2="2610011 " szAccountClass3="1234 " szAccountClass4=" " szAccountClass5="4041 " szAccountClass6=" " szAccountClass7=" " szAccountClass8=" " szAccountClass9=" " szAccountClass10=" " szAccountClass11=" " szAccountClass12=" " szAccountClass13=" " szAccountClass14=" " szAccountClass15=" " szAccountClass16=" " szAccountClass17=" " szAccountClass18=" " szAccountClass19=" " szAccountClass20=" " bAutomaticallyDone="-1" szLastUpdLocal="20111229105535" szBase="ART_SALE" lSequenceNumber="1183" /></Fields>'
union all select '<Fields><deleted lOID="1" lWPEC="0" lTechLayerAccessID="1" szLastUpdLocal="20111216100527" /></Fields>'

select t2.result from @t t1
cross apply (
  select t.c.value('.','varchar(max)') [result]
  from xmlField.nodes('/Fields/deleted') as a(b)
  outer apply a.b.nodes('@*') as t(c)
) t2
where t1.xmlField is not null
12 янв 12, 12:47    [11891516]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
djpeter
Member

Откуда:
Сообщений: 33
Спасибо! То что надо!
12 янв 12, 15:14    [11892950]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
set nocount on;
create table #foo(x xml);
insert into #foo(x) values
  ('<Fields>
    <deleted ID="2"
             lTab="1332"
             INmbr="2"
             szDate="20111229"
             szTime="105216"
             lTaSeqNmbr="7"
             lTaRefToCreateNmbr="3"
             dD="0.0000"
             dK="60.0000"
             szAccountClass1="30112"
             szAccountClass2="2610011"
             szAccountClass3="1234"
             szAccountClass4=" "
             szAccountClass5="4041"
             szAccountClass6=" "
             szAccountClass7=" "
             szAccountClass8=" "
             szAccountClass9=" "
             szAccountClass10=" "
             szAccountClass11=" "
             szAccountClass12=" "
             szAccountClass13=" "
             szAccountClass14=" "
             szAccountClass15=" "
             szAccountClass16=" "
             szAccountClass17=" "
             szAccountClass18=" "
             szAccountClass19=" "
             szAccountClass20=" "
             bAutomaticallyDone="-1"
             szLastUpdLocal="20111229105535"
             szBase="ART_SALE"
             lSequenceNumber="1183" />
    </Fields>')
, ('<Fields>
    <deleted lOID="1"
             lWPEC="0"
             lTechLayerAccessID="1"
             szLastUpdLocal="20111216100527" />
    </Fields>');
go
SELECT N1.n.value('local-name(.)', 'nvarchar(max)') AS attr
     , N1.n.value('data(.)', 'nvarchar(max)') AS val
  FROM #foo
 CROSS APPLY x.nodes('/Fields/deleted/@*') AS N1(n);
go
drop table #foo;
12 янв 12, 16:57    [11893870]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
djpeter
Member

Откуда:
Сообщений: 33
А если я хочу выбрать значение узла, имя которого я хочу передать в запрос как sql параметр, как это сделать?
13 янв 12, 13:54    [11899196]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
djpeter
Member

Откуда:
Сообщений: 33
При вот такой конструкции
WHERE t.c.value('local-name(.)','VARCHAR(50)') = @node_name

я получу только значение текущего узла
А мне хотелось бы получить все дочерние, у которых имя совпадает с заданным параметром
13 янв 12, 14:50    [11899764]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать все аттрибуты XML как отдельные значения  [new]
user89
Member

Откуда:
Сообщений: 2083
djpeter,
дайте исходный xml и желаемый результат
13 янв 12, 17:13    [11901215]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить