Элементы NULL в предложении FOR XML / Альтернатива XSINIL - PullRequest
1 голос
/ 27 сентября 2010

У меня есть устаревший код, похожий на:

 ...
 '<field1>' +   
 case when field1 is null then '' else cast( field1 as varchar ) end +   
 '</field1>' +  
 ...

, который генерирует следующий XML для пустых элементов:

 ....
 <field1></field1>
 ...

И я заменяю запрос FOR FOR:

 SELECT field1, 
 ...
 FOR XML RAW, ELEMENTS

Теперь, это не выводит элемент для столбцов со значениями NULL. Я знаю о XSINIL:

 FOR XML RAW, ELEMENTS XSINIL

Но при этом создается пустой XML-элемент пространства имен, который не совместим с устаревшим кодом, читающим этот вывод.

 ...
 <field1 xsi:nil="true" />
 ...

Есть ли какие-либо предложения по генерации формата ниже при использовании предложения FOR XML?

 ....
 <field1></field1>
 ...

Спасибо!

Ответы [ 3 ]

4 голосов
/ 27 сентября 2010

Одно очень простое решение: просто не указывайте "XSINIL" после ELEMENTS!

 FOR XML RAW, ELEMENTS

В этом случае вы просто не получите XML-запись для любых значений, которые имеют значение NULL.

Если вы действительно хотите пустой тег XML, вам нужно использовать что-то вроде этого:

SELECT
   ......
   ISNULL(CAST(field1 AS VARCHAR(100)), '') AS 'field1',
   ......
FROM dbo.YourTable
FOR XML RAW, ELEMENTS

, превращая таким образом пустую field1 в пустую строку и, следовательно, сериализуя ее в XML.

2 голосов
/ 15 июня 2014

Вы можете удвоить столбцы, которые могут иметь нулевое значение с пустой строкой. Значения будут объединены, и пустая строка гарантирует, что у вас всегда будет что-то, что строит узел.

Вам нужно использовать for xml path вместо for xml raw.

declare @T table
(
  Col1 int,
  Col2 int
)

insert into @T values(1, 2)
insert into @T values(1, null)
insert into @T values(null, 2)
insert into @T values(null, null)

select Col1,
       '' as Col1,
       Col2,
       '' as Col2
from @T
for xml path('row')

Результат:

<row>
  <Col1>1</Col1>
  <Col2>2</Col2>
</row>
<row>
  <Col1>1</Col1>
  <Col2></Col2>
</row>
<row>
  <Col1></Col1>
  <Col2>2</Col2>
</row>
<row>
  <Col1></Col1>
  <Col2></Col2>
</row>
0 голосов
/ 14 июня 2014

вы можете избежать трудовой работы isnull этим

    declare @Var varchar(max)
set @Var=(select 
FirstName,
LastName,
Middldle_Name
From Customer 
FOR XML AUTO, ELEMENTS xsinil , ROOT('Customer')
)
select CONVERT(xml,REPLACE(@Var,' xsi:nil="true"',''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...