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

Откуда:
Сообщений: 1214
Для начала семпл код.
DECLARE
  @hXml int
, @Xml xml = '<data>
                  <row>
                    <field1> a </field1>
                    <field2> b </field2>
                    <field3 />  
                  </row>
                  <row>
                    <field1> aa </field1>
                    <field2> bb </field2>
                    <field3> 33 </field3>
                  </row>
             </data>'

SELECT
  @Xml
 
EXEC sp_xml_preparedocument
  @hXml OUTPUT
, @Xml
 
SELECT
  *
FROM
  OPENXML( @hXml, '/data/row', 2 ) 
      WITH
      (
        field1  varchar(200) 'field1'
      , field2  varchar(200) 'field2'
      , field3  int 'field3'
  
      ) t;
EXEC sp_xml_removedocument
  @hXml;
  


Как видим, в первой строке Field3 отсутствует, и по бизнес логике мне нужно получить
a b NULL
aa bb 33

Однако OPENXML как-то сам собой предлагает мне
a b 0
aa bb 33

Это никуда не годится, потому, что 0 - вполне себе возможное значение для этого поля, и должно обрабатываться не так как NULL.


NULLIF, соответственно, не предлагать.
5 дек 14, 10:22    [16953715]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть NULL из OPENXML при пустом теге?  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
DECLARE
  @hXml int
, @Xml xml = '<data>
                  <row>
                    <field1> a </field1>
                    <field2> b </field2>
                    <field3 />  
                  </row>
                  <row>
                    <field1> aa </field1>
                    <field2> bb </field2>
                    <field3> 0 </field3>
                  </row>
             </data>'

SELECT
  @Xml
 
EXEC sp_xml_preparedocument
  @hXml OUTPUT
, @Xml
 
SELECT
  field1, field2, cast(nullif(field3, '') as int) as field3
FROM
  OPENXML( @hXml, '/data/row', 2 ) 
      WITH
      (
        field1  varchar(200) 'field1'
      , field2  varchar(200) 'field2'
      , field3  varchar(30) 'field3'
  
      ) t;
EXEC sp_xml_removedocument
  @hXml;
5 дек 14, 10:28    [16953755]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть NULL из OPENXML при пустом теге?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Красивый ход, спасибо.
5 дек 14, 10:34    [16953810]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть NULL из OPENXML при пустом теге?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
Cammomile
NULLIF, соответственно, не предлагать.

DECLARE
  @hXml int
, @Xml xml = '<data>
                  <row>
                    <field1> a </field1>
                    <field2> b </field2>
                    <field3 />  
                  </row>
                  <row>
                    <field1> aa </field1>
                    <field2> bb </field2>
                    <field3> 33 </field3>
                  </row>
             </data>'

SELECT
  @Xml
 
EXEC sp_xml_preparedocument
  @hXml OUTPUT
, @Xml
 
SELECT
  *
FROM
  OPENXML( @hXml, '/data/row', 2 ) 
      WITH
      (
        field1  varchar(200) 'field1[text()!=""]'
      , field2  varchar(200) 'field2[text()!=""]'
      , field3  int 'field3[text()!=""]'
  
      ) t;
EXEC sp_xml_removedocument @hXml;


или

select 
 c.value('field1[1][text()!=""]','varchar(200)') as field1
,c.value('field2[1][text()!=""]','varchar(200)') as field2
,c.value('field3[1][text()!=""]','int') as field3
from @Xml.nodes('//*:row') t(c)
5 дек 14, 10:39    [16953839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить