我正在尝试使用预准备语句执行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”
答案 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();