Выбор нулевого значения от XML в SQL Server

Я пытаюсь выбрать из XML, который имеет пустой указатель как один из атрибутов. Вместо того, чтобы возвратить пустой указатель, это возвращает 0. Что я делаю неправильно?
См. код ниже для тиражирования:

declare @a xml
select @a = '<TestSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instace">
  <Element>
    <Property1>1</Property1>
    <Property2>1</Property2>
  </Element>
  <Element>
    <Property1 xsi:nil="true" />
    <Property2>2</Property2>
  </Element>
  <Element>
    <Property1>3</Property1>
    <Property2>3</Property2>
  </Element>
</TestSet>'

 select ParamValues.TaskChainerTask.query('Property1').value('.','int') as Property1,
        ParamValues.TaskChainerTask.query('Property2').value('.','int') as Property2
   from @a.nodes('(/TestSet/Element)') as ParamValues(TaskChainerTask)

возвраты:

Property1   Property2
1           1
0           2
3           3

Это возвращает то же самое:

declare @a xml
select @a = '<TestSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instace">
  <Element>
    <Property1>1</Property1>
    <Property2>1</Property2>
  </Element>
  <Element>
    <Property1 xsi:nil="true" />
    <Property2>2</Property2>
  </Element>
  <Element>
    <Property1>3</Property1>
    <Property2>3</Property2>
  </Element>
</TestSet>'

 select ParamValues.TaskChainerTask.query('Property1').value('.','int') as Property1,
        ParamValues.TaskChainerTask.query('Property2').value('.','int') as Property2
   from @a.nodes('(/TestSet/Element)') as ParamValues(TaskChainerTask)

Заранее спасибо.

11
задан James A Mohler 15 January 2013 в 07:56
поделиться

2 ответа

Поскольку вы устанавливаете поля в INT, у вас возникает проблема, что оба поля xsi:nil="true" и значение 0 будут в итоге равны 0, поскольку значение по умолчанию для INT равно 0.

Вы можете сначала преобразовать в VARCHAR, чтобы обнаружить пустую строку (''), которую создают строковые поля, содержащие xsi:nil="true", а затем преобразовать результат в INT.

Этот SELECT даст вам искомый ответ

SELECT  CONVERT(INT,NULLIF(ParamValues.TaskChainerTask.query('Property1').value('.', 'varchar(5)'),'')) AS Property1
      , CONVERT(INT,NULLIF(ParamValues.TaskChainerTask.query('Property2').value('.', 'varchar(5)'),'')) AS Property2
FROM    @a.nodes('(/TestSet/Element)') AS ParamValues (TaskChainerTask) 

Результат этого дает вам:

Property1   Property2
1           1
NULL        2
3           3
5
ответ дан 3 December 2019 в 02:52
поделиться

Я просто использовал NULLIF для преобразования пустых строк в NULL по мере необходимости.

Теперь вы можете сгенерировать nil , используя FOR XML , но я никогда не придумал, как его разобрать, извините ...

2
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: