如何让SQL生成起始和结束XML标记

时间:2015-10-06 15:42:23

标签: sql xml

我有SQL,当值为NULL时,我需要将开始和结束XML标记呈现为<PropName></PropName> NOT <PropName />

我知道这不是标准,但我有这样做的商业理由。我尝试了FOR XML PATH ('')语句的几种变体,但似乎无法将其呈现为<PropName></PropName>

select [PropName] as '*' for xml path(''), type) as [PropName]

呈现<PropName />如何将其更改为呈现为<PropName></PropName>

2 个答案:

答案 0 :(得分:1)

感谢大家的反馈意见。我知道“&lt;”PropName“&gt;”“&lt;”/ PropName“&gt;”和“&lt;”PropName /“&gt;”是100%相同的东西,我得到它,谁需要它应该修复它们的结果。生成的文件将发送给第三方供应商,并且坚持将其呈现为。幸运的是,同事确定我只需要在我的外部SELECT语句的末尾放置“,TYPE”,而不是在PropName所在的子选择中,并且处理它 - 谁会猜到?我想我应该提到我的PropName是在子选择中;也许那会对答案有帮助。

答案 1 :(得分:1)

你已经找到了解决方案。只是为了了解一下...

所有语句如&#34;改变读者,而不是XML&#34;当然是对的。但有时我们必须满足第三方要求,我们无法改变。

有一些技巧可以处理空XML元素的生成。将其粘贴到一个空的查询窗口并执行。检查结果......

--The NULL-element is not there at all
SELECT 'text' AS filled
      ,'' AS empty
      ,NULL AS NotThere
FOR XML PATH('row');   

--The NULL-element is rendered using "nil"
SELECT 'text' AS filled
      ,'' AS empty
      ,NULL AS NotThere
FOR XML PATH('row'),ELEMENTS XSINIL    

--Look at this: Both columns are called "TheName". They are implicitly concatenated
SELECT 'a' AS TheName
      ,'b' AS TheName
FOR XML PATH('row')

--That leads to: Concatenate nothing with an empty string will at least return the empty string.
--this is other/better than ISNULL, because it will work with any type...
SELECT NULL AS TheName
      ,'' AS TheName
FOR XML PATH('row')

DECLARE @tbl TABLE(int1 INT, int2 INT);
INSERT INTO @tbl VALUES(NULL,1);

--int1 is missing
SELECT *
FROM @tbl
FOR XML PATH('row');  

--both elements are there
SELECT int1, '' AS int1 --ISNULL(int1,'') would not compile...
      ,int2, '' AS int2
FROM @tbl
FOR XML PATH('row');

最后:如果您真的需要这样的转换,您可以创建XML,将其转换为VARCHAR并使用Replace将所有<PropName />更改为<PropName></PropName>。我现在要洗手了; - )