我有SQL,当值为NULL时,我需要将开始和结束XML标记呈现为<PropName></PropName>
NOT <PropName />
。
我知道这不是标准,但我有这样做的商业理由。我尝试了FOR XML PATH ('')
语句的几种变体,但似乎无法将其呈现为<PropName></PropName>
。
select [PropName] as '*' for xml path(''), type) as [PropName]
呈现<PropName />
如何将其更改为呈现为<PropName></PropName>
?
答案 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>
。我现在要洗手了; - )