Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как обойти xmlns используя select * from @xmlvar.nodes(...  [new]
MaratSH
Member

Откуда: Moscow
Сообщений: 179
Подскажите, ламеру в MS SQL XML

Вот это работает, если из xml строки убрать xmlns или заменить на xmlns:qqq или что угодно вместо qqq

DECLARE @xml XML;
SET @xml = 
'
<root id="1" xmlns="http://tempuri.org/XMLSchema.xsd">
  <item id="123">
    <value1 id="111">text1</value1>
    <value2 id="222">text2</value2>
    <value3 id="222">text2</value3>
  </item>
  <item id="456">
    <value1 id="aaa">value1</value1>
    <value2 id="bbb">value2</value2>
    <value3 id="ccc">value2</value3>
  </item>
</root>
';
 
SELECT 
  r.items.value('@id', 'nvarchar(max)')       AS item_id, 
  r.items.value('value1[1]', 'nvarchar(max)') AS value1, 
  r.items.value('value2[1]', 'nvarchar(max)') AS value2, 
  r.items.value('value3[1]', 'nvarchar(max)') AS value3
FROM  @xml.nodes('root/item') AS r(items);


Файлы приходят именно с этой дурацкой xmlns, а грузить надо с минимальными усилиями с помощью скрипта.
Есть что-то в xquery чтобы сказать об этой xmlns в запросе?
24 апр 12, 18:08    [12464965]     Ответить | Цитировать Сообщить модератору
 Re: как обойти xmlns используя select * from @xmlvar.nodes(...  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Что-то типа такого:
WITH XMLNAMESPACES ('http://tempuri.org/XMLSchema.xsd' as NS)  
SELECT 
  r.items.value('@id', 'nvarchar(max)')       AS item_id, 
  r.items.value('NS:value1[1]', 'nvarchar(max)') AS value1, 
  r.items.value('NS:value2[1]', 'nvarchar(max)') AS value2, 
  r.items.value('NS:value3[1]', 'nvarchar(max)') AS value3
FROM  @xml.nodes('NS:root/NS:item') AS r(items);
24 апр 12, 18:21    [12465044]     Ответить | Цитировать Сообщить модератору
 Re: как обойти xmlns используя select * from @xmlvar.nodes(...  [new]
MaratSH
Member

Откуда: Moscow
Сообщений: 179
Jovanny
Что-то типа такого:
WITH XMLNAMESPACES ('http://tempuri.org/XMLSchema.xsd' as NS)  
SELECT 
  r.items.value('@id', 'nvarchar(max)')       AS item_id, 
  r.items.value('NS:value1[1]', 'nvarchar(max)') AS value1, 
  r.items.value('NS:value2[1]', 'nvarchar(max)') AS value2, 
  r.items.value('NS:value3[1]', 'nvarchar(max)') AS value3
FROM  @xml.nodes('NS:root/NS:item') AS r(items);


Спасибо большое! Увидев это, я прочел доку по WITH XMLNAMESPACES и сделал еще проще - не меняя запроса, только добавив строчечку!

WITH XMLNAMESPACES (DEFAULT 'http://tempuri.org/XMLSchema.xsd')
SELECT 
  r.items.value('@id', 'nvarchar(max)')       AS item_id, 
  r.items.value('value1[1]', 'nvarchar(max)') AS value1, 
  r.items.value('value2[1]', 'nvarchar(max)') AS value2, 
  r.items.value('value3[1]', 'nvarchar(max)') AS value3
FROM @xml.nodes('root/item') AS r(items);
24 апр 12, 18:23    [12465051]     Ответить | Цитировать Сообщить модератору
 Re: как обойти xmlns используя select * from @xmlvar.nodes(...  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
MaratSH
не меняя запроса, только добавив строчечку

Потому что неймспейс дефолтный - его элементы префиксировать не нужно.
24 апр 12, 19:38    [12465426]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить