Обработка пустых элементов как нулей в функции SQL Server OPENXML - PullRequest
6 голосов
/ 21 мая 2010

У меня есть следующий (очень упрощенный) XML-документ, который я читаю в свою базу данных с помощью функции OPENXML:

<root>
    <row>
        <bar>123</bar>
    </row>
    <row>
        <bar>0</bar>
    </row>
    <row>
        <bar></bar>
    </row>
</root>

Я импортирую в базу данных примерно так:

insert into [Foo]
    ([bar])
select
    ds.[bar]
from openxml(@xmlHandle, 'root/row', 2)
with ([bar] int) ds

Проблема в том, что OPENXML преобразует пустые поля с типом данных int в ноль, поэтому это вставляется в мою таблицу:

bar
----
123
0
0

Что я хочу вставить в мою таблицу:

bar
----
123
0
NULL

Как заставить функцию OPENXML обрабатывать пустые поля как NULL и не преобразовывать их в ноль по умолчанию?

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Просто столкнулся с подобной проблемой и решил ее с помощью функции NULLIF в SQL.

NULLIF на MSDN

Я уверен, что вы бы тоже не заметили:)

insert into [Foo]
    ([bar])
select
    NULLIF(ds.[bar], '')
from openxml(@xmlHandle, 'root/row', 2)
with ([bar] nvarchar(20)) ds

Удаляет беспорядок, созданный операторами CASE... END.

Надеюсь, это поможет!

6 голосов
/ 21 мая 2010

Поскольку ни у кого нет идей, вот как я «решаю» это, хотя мне это кажется взломом:

insert into [Foo]
    ([bar])
select
    isnull(ds.[bar], '') when '' then null else CAST(ds.[bar] as int) end
from openxml(@xmlHandle, 'root/row', 2)
with ([bar] nvarchar(20)) ds
3 голосов
/ 17 февраля 2011

Не уверен, насколько «сильно упрощен» ваш xml, но если у вас есть атрибут, задающий значение null, вы также можете сделать что-то похожее на ответ здесь ; в основном:

<root>
<row>
    <bar>123</bar>
</row>
<row>
    <bar>0</bar>
</row>
<row>
    <bar nil="true"></bar>
</row>

select ds.bar
from openxml(@xmlHandle, 'root/row', 2) with (
  [bar] nvarchar(20) 'bar[not(@nil = "true")]'
) ds

Этот сценарий сработал для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...