0

我正在执行这个查询:

 SELECT psq_id, question_text 
 FROM presales_question
 WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1)

当我直接在 SQL Server Management Studio 中执行它时,它可以工作。
当我使用标准的 Java 语句和结果集执行它时,它可以工作。
当我使用Apache Commons DBUtils 库(v 1.5)执行它时,我得到:

Exception in thread "main" java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "zz.ps_id" could not be bound. Query: SELECT psq_id, question_text FROM presales_question  WHERE psq_id IN(SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ?)  Parameters: [1]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:350)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:211)

似乎问题不在于查询,而在于 dbutils 库。挖掘源代码,我看到当 dbutils 调用getParameterMetaData()Statement 的方法时抛出了错误。我仍然不确定如何解决这个问题。

我的临时解决方案是编辑 dbutils 库的源代码并禁用对getParameterMetaData()(参见 AbstractQueryRunner.java 的第 196 行)的调用。它所做的只是检查传入的参数计数是否与查询中找到的相匹配,如果 != 则抛出错误。我可以跳过该检查,因为如果参数不匹配,查询无论如何都会失败。

4

1 回答 1

1

您查询不同,检查表名并重新尝试。

SELECT psq_id, text 
FROM ps_question
WHERE psq_id IN (
  SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = 1
)

和失败的那个

SELECT psq_id, question_text 
FROM presales_question  
WHERE psq_id IN (
  SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ?
)
  1. 第一个有文本,下一个有 question_text。
  2. 表名是第一个查询中的 ps_question 和另一个中的 presales_question。

100% 确保查询正常,您不需要表 zz 的任何别名。您可以删除此详细信息。


可能是您使用的旧 jdbc 驱动程序。

下载最新的驱动程序,

http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774


尝试给 1 并再次运行查询,它会运行吗?还是会失败?

改变?到 1

SELECT psq_id, question_text FROM presales_question  
WHERE psq_id IN (
  SELECT zz.psq_id FROM productservice_psq as zz WHERE zz.ps_id = ? <-- change 1
)
于 2014-01-12T19:24:04.700 回答