我正在使用SQL Query在SQL Server中使用XML返回结果。我使用下面的SQL Query-
SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT '' AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')
结果XML:
<Rows>
<Test>
<Column1></Column1>
</Test>
<Test>
<Column1>1</Column1>
</Test>
<Test>
<Column1>2</Column1>
</Test>
</Rows>
输出就像:
<Rows>
<Test>
<Column1/>
</Test>
<Test>
<Column1>1</Column1>
</Test>
<Test>
<Column1>2</Column1>
</Test>
</Rows>
任何帮助都会受到赞赏。在此先感谢。
答案 0 :(得分:3)
实际上如果我们内置XML,那么它将返回Tag作为自闭。请参阅以下SQL代码:
DECLARE @TempData Table
(
Column1 NVARCHAR(250)
)
INSERT INTO @TempData values('Column1')
INSERT INTO @TempData values('Column2')
INSERT INTO @TempData values('')
SELECT
(
SELECT * FROM @TempData FOR XML PATH('Test'), Type
)
For XML PATH (''),
ROOT('Rows')
输出:
<Rows>
<Test>
<Column1>Column1</Column1>
</Test>
<Test>
<Column1>Column2</Column1>
</Test>
<Test>
<Column1 />
</Test>
</Rows>
答案 1 :(得分:1)
我认为结果是正确的,你选择一个空字符串尝试选择null:
SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT NULL AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')
结果:
<Rows>
<Test />
<Test>
<Column1>1</Column1>
</Test>
<Test>
<Column1>2</Column1>
</Test>
</Rows>
这甚至可以少得多。
因为您不想删除标签,请在此处尝试:
declare @output nvarchar(max)
declare @XML xml = '
<Rows>
<Test>
<Column1></Column1>
</Test>
<Test>
<Column1>1</Column1>
</Test>
<Test>
<Column1>2</Column1>
</Test>
</Rows>'
set @output = replace(cast(@XML as nvarchar(max)), '<Column1></Column1>', '<Column1/>')
select @output
很抱歉对xml结果进行硬编码我现在无法想象如何动态地将输出设置为@XML。
答案 2 :(得分:0)
首先,正如@ marc-s在评论中所提到的,根据XML规范,两种表示在语义上都是等效的。
空元素的表示形式是起始标记 紧接着是一个结束标记或一个空元素标记。
http://www.w3.org/TR/REC-xml/#NT-content
另见:
https://stackoverflow.com/a/2279530/2266979
在评论中,您澄清了自闭标签表示涉及较少的字符。
只有在SQL Server之外使用XML时才会这么做,因为在服务器中它“内部存储为二进制格式”(https://technet.microsoft.com/en-US/library/ms345115(v=SQL.90).aspx)。
如果您在SQL Server之外使用XML,这些字符很重要,您可能已将其转换为文本。但是,当您这样做时,SQL Server(2008,无论如何)会自动使用自动关闭标记。
例如:
SELECT CONVERT(varchar(max),CONVERT(xml,'<tag></tag>'));
将返回:
<tag/>
所以您需要做的就是将最终结果转换为文本。
这假设您已键入XML。如果使用FOR XML PATH
创建XML而不指定TYPE
关键字,则基本上只是生成类似于XML的文本。
所以这个:
SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH('')));
将返回:
<tag></tag>
如果您改为使用TYPE
关键字:
SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH(''), TYPE));
你会得到:
<tag/>