1

我正在使用 SQL 查询在 SQL Server 中以 XML 形式返回结果。我正在使用以下 SQL 查询-

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>

任何帮助将不胜感激。提前致谢。

4

3 回答 3

4

实际上,如果我们在 XML 内部,那么它将返回标签作为自关闭。请看下面的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>
于 2012-12-21T09:02:50.803 回答
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。

于 2012-12-21T05:54:30.490 回答
1

首先,正如@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没有指定TYPE关键字的情况下创建 XML,那么您实际上只是在生成看起来像 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/>
于 2015-07-28T18:41:50.993 回答