2016-01-21 42 views
1

通過MSSQL JDBC使用預準備語句:點表示法預處理語句的MS SQL 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 '##[email protected]'. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1635) 

似乎與上面的SELECT語句中的「點號」的問題。我可以成功執行一個:

SELECT * FROM ##tmp?; 

傳入參數。

問題是使用點符號還是與連接?

感謝您的考慮!

+0

不應該'FROM ## TMP?## TMP?'只是'FROM ## TMP?'?您也可以嘗試用雙引號括起表名。 –

+0

@MickMnemonic非常感謝您的快速響應!當你傳入參數時,SELECT語句實際上是:SELECT ## tmp0.ot,(## tmp0.value + ## tmp1.value)FROM ## tmp0,## tmp1; – TheStressMan

+2

A-ha,並不是第一次明白你在試圖傳遞一個參數。你不能像這樣使用綁定變量 - 你只能參數化列_values_,而不是列/表名。包含佔位符('?')的SQL必須是有效的,並且可以解析到沒有值的DB,以便可以事先計算執行計劃等。 –

回答

0

你有沒有嘗試別名?

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

這樣你就可以從你的選擇中刪除變量引用,同時仍然保留它們以便實際選擇表格。

(猜測。可能的工作,可能會失敗,可能讓我看傻了:-)

+0

@Jan ...非常感謝回覆!你的解決方案讓我更接近了一點,但它仍然無法工作。你的解決方案使解析器更快樂。我能夠無誤地執行代碼...但是...沒有(空的)結果集。當我從普通的SQL執行它時(即沒有準備好的語句),查詢就可以工作。此後我不得不轉向另一種方法。 – TheStressMan