【问题标题】:JDBC errors when running a T-SQL query that uses OPENQUERY to access a linked server运行使用 OPENQUERY 访问链接服务器的 T-SQL 查询时出现 JDBC 错误
【发布时间】:2016-12-07 21:48:52
【问题描述】:

我正在尝试使用准备好的语句执行 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:无法从链接服务器“SERVERNAME”的 OLE DB 提供程序“MSDASQL”获取列信息。

更新

修复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”

【问题讨论】:

  • 看来你的 OLEDB 配置错误
  • INNERON 之前缺少空格。
  • 我在INNERON 之前添加了空格,我得到了错误:com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "c.C" could not be bound.(我在我的帖子中更新了查询中的属性名称)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您似乎需要对查询进行一些简单的更改。 您应该尝试如下所示,然后它会起作用。 您在分布式查询中使用以下四部分表名称,并且根据您的 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多