Как преобразовать значение типа XML SQL Server (xsi: nil) DateTime в null - PullRequest
7 голосов
/ 29 июля 2009

Есть ли способ запроса типа XML SQL Server, чтобы для элемента с xsi:nil="true" вместо значения даты и времени по умолчанию возвращалось значение, равное 1900-01-01 00:00:00.000?

вот фрагмент кода

declare @data xml
set @data = 
    '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:nil="true" />'
select  Value1 = @data.value('/DOD[1]', 'datetime'),
        Value2 = IsNull(@data.value('/DOD[1]', 'datetime'), 'NOT NULL?'),
        Value3 = nullif(@data.value('/DOD[1]', 'datetime'), '1900-01-01')

Value1 и Value2 оба возвращают 1900-01-01 00:00:00.000. Есть ли способ вернуть ноль, вместо этого? без использования nullif?

Ответы [ 5 ]

10 голосов
/ 30 июля 2009

Дата-время по умолчанию вызвано приведением пустой строки, равной нулю, которая дает 01 января 1900 года.

Итак: приведите в порядок строку, затем CAST

declare @data xml

set @data = 
        '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xsi:nil="true" />'

select
    Value1 = CAST(NULLIF(@data.value('/DOD[1]', 'varchar(30)'), '') AS datetime)
1 голос
/ 13 ноября 2009

легко:

declare @data xml

set @data = 
        '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xsi:nil="true" />'

select
    Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)')
0 голосов
/ 28 апреля 2017

Я знаю, что эта ветка уже давно мертва, но я думаю, что этот способ немного проще:

SELECT value1 = NULLIF(@data.value('/DOD[1]', 'datetime'), '')

Строковое значение из строки xml оценивается первым и, если оно пустое, становится нулевым datetime.

0 голосов
/ 07 ноября 2014

Этот случай может быть не для каждого

Умный способ сделать это - удалить узел DOD из XML. Итак, какой бы узел вы ни выбрали в своем наборе результатов, просто удалите этот узел при добавлении его в XML.

Так что ниже также приведёт к нулю:

declare @data xml

set @data = '<Test> </Test>'

select  Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)')

В приведенном выше примере видно, что нет узла DOD, следовательно, это приведет к нулевому значению

0 голосов
/ 05 июня 2013

Вы также можете явно проверить на ноль, например:

declare @data xml

set @data = '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />'

select Value1 = @data.value('(/DOD[not(@xsi:nil eq "true")])[1]', 'datetime')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...