自动生成的sql代码:单个反斜杠作为转义字符失败

时间:2010-09-02 11:07:36

标签: linq oracle telerik escaping backslash

我正在使用:

查询oracle 9i数据库

SELECT * FROM table WHERE列LIKE'%'|| 'someText'|| '%'ESCAPE'\';

并且失败并显示错误“转义字符必须是长度为1的字符串”(ORA-01425错误),同时在oracle express 10g数据库中成功。

使其成为双反斜杠(ESCAPE'\\')解决了oracle 9i数据库的问题,但为10g数据库生成了相同的ORA-01425错误。

我无法编辑SQL,因为它是通过Telerik OpenAccess ORM自动生成的。

导致上述SQL的Linq代码是:

activity.Name.Contains。( “SomeText” 则会)

我希望两个数据库都能处理ESCAPE'\'...或者,有另一种方法可以按名称或描述搜索表项。

提前致谢!

5 个答案:

答案 0 :(得分:2)

不熟悉Linq但是我对你执行查询的位置感到有点困惑 - 你是否只是将生成的代码粘贴到针对两个数据库运行的SQL * Plus中,至少可以解释这种行为?

如果您在SQL * Plus中执行此操作,请在每个环境中执行show escape;我怀疑9i会报告escape "\" (hex 5c),而10g会报告escape off。这可能表明先前已在9i实例中设置了转义处理,但未在(可能是最近的)10g实例中设置。

如果到目前为止任何相关内容都是相关的,请尝试在10g会话中执行set escape \并再次尝试\\版本。并且在9i中尝试执行escape off并在那里尝试单个\版本。两者现在都应该有效。

假设你还在我身边,下一个问题是为什么9i有这个设置;可能有一个login.sql或glogin.sql文件自动设置它。您可以将其删除,只要它不会影响其他任何内容,以允许生成的代码不加改变地运行。

如果您要以其他方式执行代码,我认为这些内容都不相关;不确定你是否只是在SQL * Plus中测试和调试生成的代码,并最终在其他地方执行它(再次缺乏对Linq的了解),在这种情况下,这可能是一个短暂的问题。

我也不确定你到底在逃避什么......

答案 1 :(得分:1)

尝试:

  SELECT * FROM TABLENAME 
  WHERE COLUMNNAME LIKE '\%' ESCAPE '\';

LIKE中的ESCAPE符号通常用于允许搜索符号'%'和'_'

答案 2 :(得分:1)

你可以完全避免反斜杠问题。请尝试使用转义字符周围的花括号。

http://download.oracle.com/docs/cd/B10500_01/text.920/a96518/cqspcl.htm

答案 3 :(得分:1)

每次输入或只是特定字符串都会失败吗?问题可能不在于查询,而在于输入。如果存在奇数个反斜杠,Oracle可能会试图逃避不需要转义的东西。

例如,这是有效的,因为它正在逃避'%':

select * from dual  where 'test' like '%'||'\'||'%' escape '\';

但这失败了,因为它试图逃避'a',这不需要转义:

select * from dual  where 'test' like '%'||'\a'||'%' escape '\';

你可以在传递给函数之前修改字符串并修复奇数反斜杠吗?

答案 4 :(得分:1)

如果有人因同样的问题而停下来......我的问题是我正在处理“NVARCHAR2”字段。我在oracle论坛上收到了关于这个问题的帮助:)

此查询:select * from dual where'dummy',如'%'escape'\';

适用于两者,因为字段'dummy'是varchar2。如果它是nvarchar2,查询中可能(仅可能!)导致问题的部分将是“escape'\'”部分(我的oracle 9i想要转义'\',我的oracle 10g想要'\\')。 / p>

为了解决这个问题,我没有使用ORM的自动生成代码,而是编写了一个存储过程(只有在我搜索字符串时),我在这里处理nvarchar2字段,其中TableName.ColumnName就像N'%' || 'someText'|| N'%'逃脱N'\'

它工作正常:)。

然而,这并没有解释如何使用相同的NVARCHAR2列和相同的SQL查询,两个oracle服务器(我的本地PC和9i上的10g表达式)处理它们的方式不同 - 这仍然是一个问题。所以对于遇到类似问题的人来说,知道它是否是一个nvarchar2问题(我不知道它可能是个问题)可能会很好,并尝试解决它。​​