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

Откуда: Київ
Сообщений: 10428
Как выбрать из хмл все ProductID в одну строку, чтобы получилось типа

vasya; petya; grisha;

?

DECLARE @myDoc xml

SET @myDoc = '<Root>
<ProductDescription ProductID="vasya" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
<ProductDescription ProductID="petya" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
<ProductDescription ProductID="grisha" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'

SELECT  @myDoc.value('(/Root/ProductDescription/@ProductID)[2]', 'nvarchar(MAX)' )
8 апр 13, 15:03    [14151826]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
DECLARE @myDoc xml

SET @myDoc = '<Root>
<ProductDescription ProductID="vasya" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
<ProductDescription ProductID="petya" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
<ProductDescription ProductID="grisha" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'

SELECT
(
  SELECT t.ProductID + '; '
  FROM
  (
    SELECT  x.a.value('.[1]', 'nvarchar(max)') AS ProductID
    FROM @mydoc.nodes('/Root/ProductDescription/@ProductID') x(a)
  ) t
  FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)');
8 апр 13, 15:15    [14151922]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML  [new]
dalex1973
Member

Откуда: Польша
Сообщений: 287
Winnipuh,

Без езды по узлам:
SELECT  @myDoc.query('for $i in (/Root/ProductDescription)
return <A>{data($i/@ProductID)};</A>
').value('.','nvarchar(max)')

если разделитель не обязателен(пробел будет):
SELECT @myDoc.query('data(/Root/ProductDescription/@ProductID)').value('.','nvarchar(max)')
8 апр 13, 15:34    [14152056]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
dalex1973
Winnipuh,

Без езды по узлам:
SELECT  @myDoc.query('for $i in (/Root/ProductDescription)
return <A>{data($i/@ProductID)};</A>
').value('.','nvarchar(max)')

если разделитель не обязателен(пробел будет):
SELECT @myDoc.query('data(/Root/ProductDescription/@ProductID)').value('.','nvarchar(max)')


спасибо за ответы.. но тут проблема такая:

В реальности это таблица с 10 млн узлов, в одном из полей сидит хмл, в котором может быть 0-N значений с именами файлов.
Пробовал через CROSS APPLY - красиво, но производительность просто писец, будет неделю работать...
Пытаюсь по-другому, вытащить

ид, строка с именами файлов с разделителями

И пробел не пройдет, надо, чтобы гарантированно можно было потом вытащить имена. Вместо ; использую |
8 апр 13, 16:09    [14152341]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить