2016-08-02 46 views
1

我試圖使用預處理語句執行SQL Server查詢:JDBC錯誤時使用OPENQUERY一個T-SQL查詢來訪問鏈接服務器

PreparedStatement pst = con.prepareStatement("select * from openquery(SERVERNAME," + 
              "'Select r.A , r.B, c.C from Y r" + 
              "INNER JOIN X c" + 
              "ON r.RNID = c.RNID ')" + 
              "where c.C in ?"); 

pst.setString(1, data); 

ResultSet rs = pst.executeQuery(); 

我收到此錯誤信息:

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot get the column information from OLE DB provider "MSDASQL" for linked server "SERVERNAME".

更新

固定SQL語句添加想着以後摹空間

PreparedStatement pst = con.prepareStatement("select * from openquery(SERVERNAME, " + 
              "'Select r.A , r.B, c.C from Y r " + 
              "INNER JOIN X c " + 
              "ON r.RNID = c.RNID ') " + 
              "where c.C in ?"); 

我現在得到的錯誤

com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "c.C" could not be bound

+0

看起來像你OLEDB配置是錯誤的 – Jens

+0

你在'INNER'和'ON'之前缺少空格。 – Andreas

+0

我在'INNER'和'ON'之前加了空格,出現錯誤:'com.microsoft.sqlserver.jdbc.SQLServerException:無法綁定多部分標識符「cC」。(我更新了屬性名稱在我的帖子中查詢) – Platus

回答

0

表的別名內使用OPENQUERY功能根本就沒有可供調用它的查詢。因此,這將失敗, '多部分標識符 「c.ID」 無法綁定':

SELECT * 
FROM 
    OPENQUERY(ACCDBTEST, 'SELECT c.ID, c.LastName FROM Clients c') 
WHERE c.ID = 1 

但這個工程

SELECT * 
FROM 
    OPENQUERY(ACCDBTEST, 'SELECT c.ID, c.LastName FROM Clients c') 
WHERE ID = 1 

爲做到這一點

SELECT * 
FROM 
    OPENQUERY(ACCDBTEST, 'SELECT c.ID, c.LastName FROM Clients c') AS x 
WHERE x.ID = 1