我正在尝试使用以下代码在 Java 7 中使用 Java PreparedStatement
执行 SQL
查询:
PreparedStatement functionalCRsStatement = con.prepareStatement(
"select * from openquery(SERVER,\n" +
"\t'Select X , Y, Z, A from D r\n" +
"\tINNER JOIN E c\n" +
"\tON r.RNID = c.RNID\n" +
"\twhere c.Y = ?')\n");
functionalCRsStatement.setString(2, x);
我收到以下错误消息:com.microsoft.sqlserver.jdbc.SQLServerException:索引 2 超出范围。
PS:我确信 SQL 查询的正确性,因为我在没有 PreparedStatement
的情况下成功地测试了它,我只是将查询中的列的真实名称替换为假的 (X, Y, Z) 来隐藏潜在的 secret 信息。
编辑:我在使用 setString(1, x)
时遇到了类似的错误 => index 1 is out of range
最佳答案
正如@JonK 评论的那样,您的查询中有撇号,这意味着您的参数实际上位于 SQL 引擎不会绑定(bind)值的字符串中(无论您使用 1 还是 2 作为索引):
PreparedStatement functionalCRsStatement = con.prepareStatement(
"select * from openquery(APRPRD,\n" +
"\t'Select X , Y, Z, A from D r\n" +
"\tINNER JOIN E c\n" +
"\tON r.RNID = c.RNID\n" +
"\twhere c.Y = ?')\n");
包含此查询(带有 SQL 语法高亮显示,显示整个字符串)
select * from openquery(APRPRD,
'Select X , Y, Z, A from D r
INNER JOIN E c
ON r.RNID = c.RNID
where c.Y = ?')
SQL 引擎从不检查字符串的内部。否则如何插入包含问号的字符串?
关于Java PreparedStatement : com. microsoft.sqlserver.jdbc.SQLServerException,索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655215/