简体   繁体   English

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

[英]JDBC errors when running a T-SQL query that uses OPENQUERY to access a linked server

I'm trying to execute a SQL Server query using prepared statements:我正在尝试使用准备好的语句执行 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();

I get this error message:我收到此错误消息:

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot get the column information from OLE DB provider "MSDASQL" for linked server "SERVERNAME". com.microsoft.sqlserver.jdbc.SQLServerException:无法从链接服务器“SERVERNAME”的 OLE DB 提供程序“MSDASQL”获取列信息。

Update更新

After fixing the SQL statement to add the missing spaces修复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 ?");

I now get the error我现在得到错误

com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "cC" could not be bound com.microsoft.sqlserver.jdbc.SQLServerException:无法绑定多部分标识符“cC”

The table aliases used within the OPENQUERY function are simply not available to the query that calls it.内部使用的表别名OPENQUERY功能根本就没有可供调用它的查询。 So, this will fail with 'multi-part identifier "c.ID" could not be bound':因此,这将因“无法绑定多部分标识符“c.ID”而失败:

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

but this works但这有效

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

as does this像这样

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

It's look like you need to make simple changes in your query.看起来您需要对查询进行简单的更改。 You should try as I shown below then it will work.你应该像我下面显示的那样尝试然后它会起作用。 You use below Four part table name in a distributed query and depending on your Java backend you need to omit the database name and schema.您在分布式查询中使用以下四部分表名称,根据您的 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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM