【问题标题】:How to eliminate special characters(&#x0d) in xml format of the result set?如何消除结果集的xml格式的特殊字符(&#x0d)?
【发布时间】:2017-04-20 11:22:55
【问题描述】:

在 TSQL 中将查询结果集转换为 xml 格式时,在行尾显示 ' '。请帮助我消除此问题。

其实我是用下面的查询来获取慢查询,

SELECT top 10 qs.execution_count Exec_count, 
(qs.total_elapsed_time / qs.execution_count )/ 1000000.0 AS Avg_exec_time,
convert(datetime2(0),qs.last_execution_time) Last_exec_time,
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) AS Query
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY Avg_exec_time DESC for xml path('slow_query')

示例结果集:(我刚刚从输出中挑选了一些行)

> @queue_agent, 
>             msqh.runstatus, 
>             msqa.id,
>             msqa.name,

【问题讨论】:

  • 如果您不需要/想要转义 XML 节点值,请不要使用 FOR XML

标签: sql sql-server xml tsql


【解决方案1】:

不太清楚,你的问题实际上是什么......

&x0D; 是回车(换行符)的实体代码

您必须区分XML 中的数据您从XML 中读出的数据

在 XML 中,许多字符需要被转义,否则会有特殊的语义。如果您在 in XML 中看到此代码,一切都应该没问题...

如果您从 XML 中读取数据,问题是:您是如何做到的?如果正确完成,所有这些编码和重新编码都应该隐式完成......

如果这对您没有帮助,请提供更多详细信息...

更新

作为速成,您可以使用REPLACE(YourString,CHAR(13),'') 在创建 XML之前删除这些字符...

更新 2

我还是不明白,为什么这对你很重要......

您肯定知道,有几种方法可以对换行符进行编码。但在所有情况下,这只是一个(或两个)特殊字符。它们是否呈现为可见的换行符是您用于读取数据的工具的问题。

检查一下(在 SSMS 中):

SELECT 
'
' AS VisibleLineBreak
,CHAR(10) AS LineFeed
,CHAR(13) AS CarriagReturn
,CHAR(13)+CHAR(10) AS NewLine
,CHAR(10)+CHAR(13) AS WrongOrder
FOR XML PATH('LineBreaks');

网格输出中的可见结果

<LineBreaks><VisibleLineBreak>&#x0D;</VisibleLineBreak><LineFeed>&#x0A;</LineFeed><CarriagReturn>&#x0D;</CarriagReturn><NewLine>&#x0D;</NewLine></LineBreaks>

但是,如果您单击 XML“链接”以打开 XML 查看器,您会得到这个

<LineBreaks>
  <VisibleLineBreak>
    </VisibleLineBreak>
  <LineFeed>
</LineFeed>
  <CarriagReturn>
</CarriagReturn>
  <NewLine>
</NewLine>
  <WrongOrder>

</WrongOrder>
</LineBreaks>

输出到文本的结果是

<LineBreaks><VisibleLineBreak>&#x0D;
    </VisibleLineBreak><LineFeed>&#x0A;</LineFeed><CarriagReturn>&#x0D;</CarriagReturn><NewLine>&#x0D;
</NewLine><WrongOrder>
&#x0D;</WrongOrder></LineBreaks>

最常见的“NewLine”(13+10 或 0A+0D)以书面形式给出 x0D,但已执行 x0A,而显式 x0A 则按原样写成 ...

我想说的是:不要担心 XML 中的编码。这不是供人类阅读的!。阅读应用程序必须关心这些特殊字符的正确表示

【讨论】:

  • 实际上@shnugo 我提到的上述脚本用于获取 xml 格式的慢速查询。该脚本在 SSMS 中给出了正确的结果集。但是当我在 TSQL 中运行它时,它显示 &x0D;在行尾。如何消除这个?
  • 请在您的本地服务器环境中运行上述 db 脚本。然后您就会明白我要说的意思了。
  • 如何通过 TSQL 实现它
  • @SujithTee 对不起,我不明白我怎样才能通过TSQL实现它...上面的代码是TSQL,你可以清楚地看到,它不是查询的结果集负责这些字符,但您查看它的方式(例如:reading 工具)。 &amp;#x0D; 没有任何问题,只要它是 within XML...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多