【发布时间】:2016-01-21 23:33:04
【问题描述】:
通过 MSSQL JDBC 使用准备好的语句:
CREATE TABLE ##tmp? ( ot smalldatetime, value smallint );
CREATE TABLE ##tmp? ( ot smalldatetime, value smallint );
有效!
INSERT INTO ##tmp?
SELECT Forecast_Valid_Time, Temperature
FROM fct_masterAll
WHERE Location_ID = ? AND
revision = 0 AND
forecast_type_code = 4 AND
forecaster = 'ETA' AND
Forecast_Issued_Time = ?
ORDER BY Forecast_Valid_Time ASC;
有效!
INSERT INTO ##tmp?
SELECT Forecast_Valid_Time, Temperature
FROM fct_masterAll
WHERE Location_ID = ? AND
revision = 0 AND
forecast_type_code = 4 AND
forecaster = 'MRF' AND
Forecast_Issued_Time = ?
ORDER BY Forecast_Valid_Time ASC;
有效!
但是……
SELECT ##tmp?.ot, ( ##tmp?.value + ##tmp?.value ) FROM ##tmp?, ##tmp?;
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name '##tmp@P3'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1635)
上面的 SELECT 语句中的“点表示法”似乎有问题。我可以成功执行一个:
SELECT * FROM ##tmp?;
传入参数。
是点符号的问题,还是连接的问题?
感谢您的考虑!
【问题讨论】:
-
不应该
FROM ##tmp?, ##tmp?只是FROM ##tmp?吗?您也可以尝试用双引号将表名括起来。 -
@MickMnemonic 非常感谢您的快速回复!当你传入'parameters'时,SELECT语句实际上是:SELECT ##tmp0.ot, (##tmp0.value + ##tmp1.value) FROM ##tmp0, ##tmp1;
-
啊哈,起初并没有明白你试图在那里传递一个参数。你不能使用这样的绑定变量——你只能参数化列值,而不是列/表名。保存占位符 (
?) 的 SQL 必须是有效的并且可以在没有值的情况下解析到数据库,以便可以预先计算执行计划等。 -
我看不出您的第一个示例实际上是如何工作的,除非您有一个名为
##tmp?的表。 -
@MickMnemonic 非常感谢!一切正常,直到你得到所说的 SELECT 语句。我可以将参数传递给 SELECT * FROM ##tmp?并得到一个结果集。当我尝试使用点符号进行连接时,它开始抱怨。除非出现其他问题...我需要找到不同的方法。再次感谢您的快速回复!
标签: sql-server jdbc prepared-statement