如果我有xml跟随一些空节点,如下所示。
<TAG ID="abc"></TAG>
当我修改/选择这个xml时,它返回空标签,如
<TAG ID="abc" />
我希望关闭空标签</TAG>
关闭,如
我可以实现这个目标吗?
答案 0 :(得分:2)
请注意,SQL Server中XML结果的序列化不是由XQuery本身决定,而是由XML数据类型转换为字符串表示。在你的例子中
DECLARE @X XML; SET @X = '<TAG ID="abc"></TAG>'; SELECT @X;
您没有使用XQuery,您只是使用XML Parser和XML序列化程序。
因此,即使我们添加了XQuery vNext的序列化选项,它们也不会产生影响。
正如Michael Kay所提到的,两个序列化之间没有区别。你为什么要区分这两者?如果您有一个需要区分的工具,我建议让他们更改它以使其解析器符合标准。或者,看看您是否可以在客户端找到XML Parser / serializer,它为您提供了如何序列化空内容元素的选项。
如果您需要完整的词法保真度而不是数据库中的XML Infoset保真度,我建议将XML存储在varbinary(max)中,因为这将保留您的编码和您输入的每个代码点,但代价是对XML进行运行时强制转换以进行任何查询处理。
祝你好运 迈克尔
答案 1 :(得分:1)
任何使用XML的应用程序都应该视为等效,因此XQuery处理器假定它们是等效的,并且没有合理的理由说明用户应该优先选择一种形式而不是另一种形式。 (同样,例如,它们不允许您要求属性为单引号而不是双引号,或者在“=”符号周围添加空格。)
答案 2 :(得分:0)
在许多XQuery 3.0处理器(BaseX,Saxon等)中,“html”可以指定为序列化选项,它将以预期的方式输出空元素:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "html";
<TAG ID="abc"></TAG>
但是,我不知道在SQL Server中是否支持XQuery 3.0,或者它是否提供了另一种更改序列化默认值的方法。