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

Откуда: 大地
Сообщений: 3264
DECLARE @XML xml
DECLARE @ENTITIES TABLE
 (
   [Id] INT
   ,[Sequence] INT
   ,[Name] VARCHAR(128)
 )
 
 
 INSERT @ENTITIES ( [Id], [Sequence], [Name] ) VALUES ( 0, 1, 'A' )
 INSERT @ENTITIES ( [Id], [Sequence], [Name] ) VALUES ( 1, 0, 'B' )
 
 
 SET @XML = N'<root><item><A><someitem/></A><B><anyotheritem/></B></root>'
 
 SELECT 
  E.[Id]
  , P.nodes  -- весь контент <root><item><A>, <root><item><B>  
 FROM @ENTITIES [E]
 CROSS APPLY (
  SELECT 
  FROM @XML.query ('') nodes -- ? выбрать из динамической строки
 )
 /*
  надо получить 
    
  0, '<someitem/>'  - все ноды 
  1, '<anyotheritem/>'
  
 */


 
19 июл 12, 08:39    [12886546]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
Ken@t,

у вас xml невалидный - тэг item не закрыт.
19 июл 12, 08:54    [12886579]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Сон Веры Павловны
Ken@t,

у вас xml невалидный - тэг item не закрыт.

спасибо, но сути не меняет
19 июл 12, 09:03    [12886600]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
Ken@t
спасибо, но сути не меняет

Т.е. не меняет? У вас невалидный xml, и поэтому непонятно, что из него вообще нужно выбирать, и какой xpath писать.
Или вопрос в том, как для query() динамически задать xpath? Никак, это строковый литерал. Можно попробовать набросать нужные xpath для известных случаев, выборки с нодами по xpath объединить, и джойниться к этому объединению.
19 июл 12, 09:11    [12886619]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Сон Веры Павловны
Ken@t
спасибо, но сути не меняет

Т.е. не меняет? У вас невалидный xml, и поэтому непонятно, что из него вообще нужно выбирать, и какой xpath писать.
Или вопрос в том, как для query() динамически задать xpath? Никак, это строковый литерал. Можно попробовать набросать нужные xpath для известных случаев, выборки с нодами по xpath объединить, и джойниться к этому объединению.

Ok

DECLARE @XML xml
DECLARE @ENTITIES TABLE
 (
   [Id] INT
   ,[Sequence] INT
   ,[Name] VARCHAR(128)
 )
 
 
 INSERT @ENTITIES ( [Id], [Sequence], [Name] ) VALUES ( 0, 1, 'A' )
 INSERT @ENTITIES ( [Id], [Sequence], [Name] ) VALUES ( 1, 0, 'B' )
 
 
 SET @XML = N'<root><item><A><someitem/></A><B><anyotheritem/></B></item></root>'
 
 SELECT 
  E.[Id]
  , P.nodes  -- весь контент <root><item><A>, <root><item><B>  
 FROM @ENTITIES [E]
 CROSS APPLY (
  SELECT 
  FROM @XML. ???  nodes
 )
 /*
  надо получить 
  
  0, '<someitem/>'  - все ноды 
  1, '<anyotheritem/>'
  
 */
 


Теперь валидный хмл, вопрос висит, как выбрать контент ноды если путь задаётся динамически ?
19 июл 12, 09:34    [12886678]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6149
Ken@t,

выше я писал примерно вот про такое:
 SELECT 
  E.[Id]
  , P.nodes
 FROM @ENTITIES [E]
 join (
   select 0 id, @xml.query('//A/someitem') nodes
   union all
   select 1 id, @xml.query('//B/anyotheritem') nodes 
 ) P on [E].Id=P.id

Можно попробовать вот так:
 SELECT 
  E.[Id]
  , P.nodes
 FROM @ENTITIES [E]
 cross apply (
	select @xml.query('//node()[local-name()=sql:column("Name")]/*')
 ) p(nodes)
19 июл 12, 09:52    [12886754]     Ответить | Цитировать Сообщить модератору
 Re: Комрады, помогите из xml контент ноды выбрать  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Сон Веры Павловны,

Спасибо
19 июл 12, 10:32    [12886963]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить