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 格式不正确,因为 < 字符。然后我用谷歌搜索解释,我发现,我必须像下面的例子一样转义字符
< = < , > = >
但是当我转义这些字符时,查询没有执行。这是无效的,因为转义。您知道如何解决这个问题或任何解决方法吗?
不知道这是否仍然开放,但 - 至少 - 它没有得到答复:
您不应将 XML 视为带有花哨的额外字符的字符串。将内容 放入 XML 有一些规则,从 XML 中读取值 也有一些规则。您可以轻松地在字符串级别创建 看起来 类似于 XML 的内容,但是 - 如果您的 xml 无效 - 您会遇到麻烦。
最重要的例外是 - 显然! - <, > and &
,如果不转义,会干扰标记。
DECLARE @xml XML=N'<root>SELECT column_name FROM table WHERE columnid <= 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
的内容存储为转义字符串。语义上是一样的...
假设我有 sql 这样的查询:
SELECT column_name FROM table WHERE columnid <= 5
在 orm.xml 中定义如下:
<named-query>
<query>
sql query
</query>
</named-query>
环境说 xml 格式不正确,因为 < 字符。然后我用谷歌搜索解释,我发现,我必须像下面的例子一样转义字符
< = < , > = >
但是当我转义这些字符时,查询没有执行。这是无效的,因为转义。您知道如何解决这个问题或任何解决方法吗?
不知道这是否仍然开放,但 - 至少 - 它没有得到答复:
您不应将 XML 视为带有花哨的额外字符的字符串。将内容 放入 XML 有一些规则,从 XML 中读取值 也有一些规则。您可以轻松地在字符串级别创建 看起来 类似于 XML 的内容,但是 - 如果您的 xml 无效 - 您会遇到麻烦。
最重要的例外是 - 显然! - <, > and &
,如果不转义,会干扰标记。
DECLARE @xml XML=N'<root>SELECT column_name FROM table WHERE columnid <= 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
的内容存储为转义字符串。语义上是一样的...