Я пытаюсь выбрать из 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)
Заранее спасибо.
Поскольку вы устанавливаете поля в 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
Я просто использовал NULLIF для преобразования пустых строк в NULL по мере необходимости.
Теперь вы можете сгенерировать nil
, используя FOR XML
, но я никогда не придумал, как его разобрать, извините ...