运行使用OPENQUERY访问链接服务器的T-SQL查询时出现JDBC错误

时间:2016-08-02 13:41:26

标签: java sql-server sql-server-2008 jdbc

我正在尝试使用预准备语句执行SQL Server查询:

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:无法从OLE DB提供程序“MSDASQL”获取链接服务器“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:无法绑定多部分标识符“c.C”

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您似乎需要对查询进行简单的更改。 你应该像我下面显示的那样尝试然后它会起作用。 您在分布式查询中使用以下四部分表名,根据您的 Java 后端,您需要省略数据库名称和架构。

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

    pst.setString(1, data);

    ResultSet rs = pst.executeQuery();