如何消除特殊字符( )结果集的xml格式?

时间:2017-04-20 11:22:56

标签: sql sql-server xml tsql

在TSQL中将查询结果集转换为xml格式时,它会在行尾显示“& #x0d”。请帮我消除此问题。

实际上我使用以下查询来获取慢查询,

$sqlOverall="SELECT CAST(AVG(scoreOverall) AS DECIMAL(10,1)) FROM ratings WHERE gameID=$id";
$scoreOverall = mysqli_query($conn, $sqlOverall);
foreach ($scoreOverall as $value) { 
    $scoreOverall = $value['CAST(AVG(queue_status) AS DECIMAL(10,1))']; 
    echo $scoreOverall;
}

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

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')

1 个答案:

答案 0 :(得分:0)

不太确定,你的问题实际上是什么......

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

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

在XML中,需要转义许多字符,否则会有特殊的语义。如果您在 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&#34;链接&#34;为了打开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>

最常见的&#34; NewLine&#34; (13 + 10或0A + 0D)使用书面x0D但执行x0A,而显式x0A 编写 ...

我想对此说些什么:不要为 XML中的编码而烦恼。这意味着人类阅读!。阅读应用程序必须打扰这些特殊字符的正确表示