使用lower()时在/附近的语法错误

时间:2012-04-16 09:39:10

标签: postgresql

我从表中检索以下sql语句,然后使用绑定变量替换值。运行语句时出现语法错误。它似乎是由于lower()函数而发生的,但我相信我正确使用它。我已经尝试通过psql手动运行语句,它可以正常使用我提供的值。有没有人对这个有任何想法?我试过切换'for $$但这没有效果。

语句

SELECT column_name 
FROM information_schema.columns 
WHERE table_name=lower(':1') 
  and column_name=lower(':2')

具有替代值的预期基本陈述

SELECT column_name 
FROM information_schema.columns 
WHERE table_name=lower('MyTableName') 
  and column_name=lower('MyColumnName')
由postgresql运行的

语句

SELECT column_name 
FROM information_schema.columns 
WHERE table_name=lower('((E'RWOL_TMA_ROADWORKS'))') 
and column_name=lower('((E'TPHS_CWAY_RESTRICT_TYPE'))')

C#中的错误

ERROR: 42601: syntax error at or near \"MyTableName\"

PostgreSQL日志文件中的错误

2012-04-16 11:36:15 BST ERROR:  syntax error at or near "RWOL_TMA_ROADWORKS" at character 80
2012-04-16 11:36:15 BST STATEMENT:  SELECT column_name FROM information_schema.columns WHERE table_name=lower('((E'RWOL_TMA_ROADWORKS'))') and column_name=lower('((E'TPHS_CWAY_RESTRICT_TYPE'))')

编辑:检索和实现代码是用C#编写的。我使用数据库连接基类和npgsql提供程序工厂来建立连接,运行查询和检索数据。此方法适用于使用此绑定变量等方法的所有其他查询,除此之外我尝试使用lower()函数。

编辑:我已经尝试完全删除引号,让绑定代理处理引用值,这提供了相同的语法错误。

编辑:现在已启用日志记录并添加了postgresql正在运行的实际语句。

3 个答案:

答案 0 :(得分:1)

也许您不应该使用:1:2周围的引号。大多数支持绑定变量的API都会为您正确引用该值。

答案 1 :(得分:1)

我认为它不是lower()函数'问题,而是绑定变量处理问题。

正如@Adrian建议的那样,尽量不要在绑定变量周围使用引号。 你还应该查阅你的数据库日志,你会看到有关正在发生的事情的更多信息。

编辑:使用:

SHOW data_directory;
SHOW log_directory;

SQL语句,用于查找DATA目录的位置和日志位置,如果日志路径是相对的,那么它将相对于DATA目录。

去那里找到最近修改过的文件,检查内容。您应该看到带有默认PostgreSQL配置的错误消息。

在中间件/工厂级别启用调试也很有用。

答案 2 :(得分:1)

我认为vyegorov正走在正确的道路上 - 你的占位符会有一些有趣的东西。

我不认为您的第二个示例是替换后的实际查询,因为它不包含任何错误。它来自哪里,为什么不提供实际查询 - 你是否在PostgreSQL中打开了语句记录?

另外,我怀疑语法错误 - 转义双引号会发生什么?它们实际上是双引号而不是单引号吗?

  1. 您确定占位符周围需要单引号吗?通常司机会为您管理。

  2. 您确定不会在任何地方重复引用这些值吗?

  3. 获取实际的SQL并查看引用,我怀疑问题会很明显。

    更新:现在有SQL

    以下是发布声明中的错误:

    lower('((E'RWOL_TMA_ROADWORKS'))')
    

    这里有两个级别的引号。删除你添加的那些,我们应该得到类似的东西:

    lower((E'RWOL_TMA_ROADWORKS'))
    

    忽略有效的重复括号(E'...'是c样式转义字符串的语法 - 围绕standard_conforming_strings进行google)。