【问题标题】:Dot Notation Prepared Statement MS SQL JDBC点表示法准备语句 MS SQL JDBC
【发布时间】: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


【解决方案1】:

你尝试过别名吗?

SELECT A.ot, ( A.value + B.value ) FROM ##tmp? A, ##tmp? B;

这样您就可以从您的选择中删除变量引用,同时仍然保留它们以供实际选择表。

(猜测。可能会成功,可能会失败,可能会让我看起来很傻 :-)

【讨论】:

  • @Jan...非常感谢您的回复!你的解决方案让我更接近了一点,但它仍然没有用。您的解决方案使解析器更快乐。我能够毫无错误地执行代码......但是......没有(空的)结果集。当我从普通 SQL 执行查询时(即没有准备好的语句),该查询有效。从那以后,我不得不转向另一种方法。
猜你喜欢
  • 2018-04-10
  • 2013-12-28
  • 2018-03-14
  • 2020-05-04
  • 1970-01-01
  • 2014-12-28
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多