SQL 由于转义字符,查询未执行

SQL query does not executes because of escaped characters

假设我有 sql 这样的查询:

SELECT column_name FROM table WHERE columnid <= 5

在 orm.xml 中定义如下:

<named-query>
  <query>
    sql query
  </query>
</named-query>

环境说 xml 格式不正确,因为 < 字符。然后我用谷歌搜索解释,我发现,我必须像下面的例子一样转义字符

< = &lt , > = &gt

但是当我转义这些字符时,查询没有执行。这是无效的,因为转义。您知道如何解决这个问题或任何解决方法吗?

不知道这是否仍然开放,但 - 至少 - 它没有得到答复:

您不应将 XML 视为带有花哨的额外字符的字符串。将内容 放入 XML 有一些规则,从 XML 中读取值 也有一些规则。您可以轻松地在字符串级别创建 看起来 类似于 XML 的内容,但是 - 如果您的 xml 无效 - 您会遇到麻烦。

最重要的例外是 - 显然! - <, > and &,如果不转义,会干扰标记。

DECLARE @xml XML=N'<root>SELECT column_name FROM table WHERE columnid &lt;= 5</root>';
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)');

你会发现,转义字符被隐式地重新转换。 但是您必须使用适当的工具来阅读XML!。如果您使用字符串方法(如 substring)阅读 XML,则必须确保自己重新转义。

有一个 - 不推荐 - 解决方法:您可以使用 CDATA 部分,如下所示:

DECLARE @xml XML=N'<root><![CDATA[SELECT column_name FROM table WHERE columnid <= 5]]></root>';
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)');

这允许您将文本放入 XML 中,这将 保持原样 。但是这个已经过时了,在 SQL-Server 中不直接支持(好吧,还有 FOR XML EXPLICIT,它本身就已经过时了)。 SQL-服务器实际上会自动将上面没有 CDATA 的内容存储为转义字符串。语义上是一样的...