Если я правильно понял, ваш вопрос:
Как мне поставить запрос для создания этих <SomeElement />
тегов?
Посмотрите на это:
- это создаст заполненные узлы
SELECT 'outer' AS [OuterNode/@attr]
,'inner' AS [OuterNode/InnerNode]
FOR XML PATH('row');
- пустая строка представляет собой некоторый контент
SELECT 'outer' AS [OuterNode/@attr]
,'' AS [OuterNode/InnerNode]
FOR XML PATH('row');
- отсутствующее значение (NULL
) по умолчанию опущено
SELECT 'outer' AS [OuterNode/@attr]
,NULL AS [OuterNode/InnerNode]
FOR XML PATH('row');
- Теперь проверьте, что здесь происходит:
--First XML имеет пустой элемент, а второй использует самозакрывающийся элемент
DECLARE @xml1 XML=
N'<row>
<OuterNode attr="outer">
<InnerNode></InnerNode>
</OuterNode>
</row>';
DECLARE @xml2 XML=
N'<row>
<OuterNode attr="outer">
<InnerNode/>
</OuterNode>
</row>';
SELECT @xml1,@xml2;
Результат одинаков для обоих ...
Некоторый фон: Семантически пустой элемент <element></element>
точно такой же, как самозакрывающийся элемент <element />
. Это не должно иметь никакого значения, используете ли вы один или другой. Если ваш потребитель не может справиться с этим, это проблема в части чтения.
Да, вы можете принудительно установить любой контент в XML на строковом уровне, но - как показано в примере выше - это всего лишь (опасный) взлом.
XML в T- SQL возвращает - по умолчанию - отсутствующий узел как NULL
, а пустой элемент как пусто (в зависимости от типа данных, и остерегайтесь разницы между элементом и его text()
узлом).
Короче говоря: вам не о чем думать ...