【问题标题】:SQL query does not executes because of escaped characters由于转义字符,SQL 查询不执行
【发布时间】:2017-09-11 08:20:34
【问题描述】:

假设我有这样的 sql 查询:

SELECT column_name FROM table WHERE columnid <= 5

在 orm.xml 中定义如下:

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

环境说xml格式不好,因为

< = &lt , > = &gt

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

【问题讨论】:

  • 你是如何从 xml 中获取查询的?您需要将其通过 HTTP 解码回 codebeautify.org/html-decode-string
  • &amp;gt; 带分号。使用普通的 XML API 函数设置和获取会隐藏这一点。
  • 好吧,我不完全知道我是如何获取查询的,因为这个 orm.xml 文件没有映射到任何地方......我正在使用 spring 和 hibernate,所以它必须以某种方式自己做这个跨度>

标签: java sql xml sql-server-2016


【解决方案1】:

不知道这是否仍然开放,但 - 至少 - 没有答案:

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

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

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-section,如下所示:

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-Server 实际上会自动将没有CDATA 的上述内容存储为转义字符串。语义上是一样的……

【讨论】:

    最近更新 更多