0

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

陈述

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 正在运行的实际语句。

4

3 回答 3

1

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

于 2012-04-16T09:57:27.020 回答
1

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

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

编辑:使用:

SHOW data_directory;
SHOW log_directory;

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

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

在中间件/工厂级别上启用调试对您也有好处。

于 2012-04-16T09:58:44.853 回答
1

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

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

另外,我怀疑语法错误——转义的双引号是怎么回事?它们实际上是双引号而不是双引号吗?

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

  2. 你确定你没有在任何地方双引号吗?

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

更新:现在有 SQL

这是已发布声明中的错误:

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

您在这里有两个级别的报价。删除您添加的那些,我们应该得到类似的结果:

lower((E'RWOL_TMA_ROADWORKS'))

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

于 2012-04-16T09:59:40.797 回答