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

Откуда:
Сообщений: 30
Здравствуйте

Столкнулся с следующей проблемой, без помощи не могу ее решить)

на упрощенном примере распишу проблему

есть код формирования xml
DECLARE @t TABLE (p1 VARCHAR(100),p2 VARCHAR(100))

INSERT INTO @t (p1,p2) VALUES ('1','1')
INSERT INTO @t (p1,p2) VALUES ('2','2')

SELECT 
  '1' AS tag1, 
  '2' AS Name,
  (SELECT (case when 1=1 THEN '1' else null end) as [value],(case when 1=1 THEN '1' else null end) as [name] FOR XML PATH('control_tag'),type)  
FROM @t
FOR XML RAW, ROOT('MyRoot'),ELEMENTS


смысл в том, что значения дочерних тэгов value и name тэга control_tag формируются в зависимости от условия (в данном случае истинного условия 1=1). Если условие не истинно то возвращается null

в результате формируется следующий Xml

<MyRoot>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
    <control_tag>
      <value>1</value>
      <name>1</name>
    </control_tag>
  </row>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
    <control_tag>
      <value>1</value>
      <name>1</name>
    </control_tag>
  </row>
</MyRoot>


Если условие изменить не неистинное (1=0) , то формируется следующий xml

<MyRoot>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
    <control_tag />
  </row>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
    <control_tag />
  </row>
</MyRoot>


Есть ли способ не формировать пустой тэг <control_tag /> при пустых значениях дочерних тэгов?

Заранее благодарен)
25 окт 17, 19:32    [20900261]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
UncleFedor32,

DECLARE @t TABLE (p1 VARCHAR(100),p2 VARCHAR(100))

INSERT INTO @t (p1,p2) VALUES ('1','1')
INSERT INTO @t (p1,p2) VALUES ('2','2')

SELECT 
  '1' AS tag1, 
  '2' AS Name,
  (SELECT (case when 1=0 THEN '1' else null end) as [value],(case when 1=0 THEN '1' else null end) as [name] FOR XML PATH('control_tag'), TYPE).query('if (empty(node()/*)) then () else .')
FROM @t
FOR XML RAW, ROOT('MyRoot'),ELEMENTS
25 окт 17, 20:35    [20900354]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
UncleFedor32
Member

Откуда:
Сообщений: 30
felix_ff,

спасибо большое! именно то, что нужно!
25 окт 17, 21:35    [20900465]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
UncleFedor32
Member

Откуда:
Сообщений: 30
Неожиданно столкнулся с другой проблемой

при использовании .query('if (empty(node()/*)) then () else .') в тэгах с атрибутами, этот тэг не выводится, даже если есть значения в атрибутах
например код
DECLARE @t TABLE (p1 VARCHAR(100),p2 VARCHAR(100))

INSERT INTO @t (p1,p2) VALUES ('1','1')
INSERT INTO @t (p1,p2) VALUES ('2','2')

SELECT 
  '1' AS tag1, 
  '2' AS Name,
  (SELECT (case when 1=0 THEN '1' else null end) as [value],(case when 1=0 THEN '1' else null end) as [name] FOR XML PATH('control_tag'),type).query('if (empty(node()/*)) then () else .'),
  (select 1111 as [@value], 'RUR' as [@currency] , 'test' AS [*] for xml PATH('price'),type).query('if (empty(node()/*)) then () else .') 
FROM @t
FOR XML RAW, ROOT('MyRoot'),ELEMENTS


возвращает результат
<MyRoot>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
  </row>
  <row>
    <tag1>1</tag1>
    <Name>2</Name>
  </row>
</MyRoot>


верно не формируется тэг contrtol_tag. При этом исключается формирование тэга price, хотя его необходимо формировать, т.к. его значение и значение атрибутов не null

помогите пожалуйста разобраться в ситуации. заранее благодарен)
30 окт 17, 18:26    [20913180]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
UncleFedor32,

SELECT 
  '1' AS tag1, 
  '2' AS Name,
  (SELECT (case when 1=1 THEN '1' else null end) as [value],(case when 1=0 THEN '1' else null end) as [name] FOR XML PATH('control_tag'),type).query('if (empty(node()/*)) then () else .'),
  (select 1111 as [@value], 'RUR' as [@currency] , 'test' AS [*] for xml PATH('price'),type).query('if (empty(node()/@*)) then () else .') 
FROM @t
FOR XML RAW, ROOT('MyRoot'),ELEMENTS
30 окт 17, 19:06    [20913298]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
UncleFedor32
Member

Откуда:
Сообщений: 30
Спасибо большое!

Подскажите пожалуйста где можно изучить этот функционал на русском языке? например, требуется универсальное выражение, которое можно вставлять в оба случая, т.к. SQL запрос генерируется динамически
30 окт 17, 19:27    [20913349]     Ответить | Цитировать Сообщить модератору
 Re: Формирование пустого тэга, в котором есть пустые вложенные тэги  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
UncleFedor32,

Погуглите XQuery и XPath.

Мануалы есть но они на английском в частности.
30 окт 17, 21:14    [20913609]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить