PreparedStatement.execute() returns false 即使 SQL 服务器中有结果集?

PreparedStatement.execute() returns false even there is resultset in SQL server?

我的 sql 查询由 5 个部分组成,它们彼此高度相关。第一部分创建一个临时 table,第二部分使用该临时 table 并创建另一个临时 table,第三部分使用在第二部分中创建的临时 table 并再次创建另一个临时 table。第 4 部分 select 来自第 3 个临时 table 的一些数据,第 5 部分 select 是第 3 个临时 table.

的计数

因为临时 tables 只能在一个 preparedStatement 中使用(我的意思是一个由 preparedStatement 创建的临时 table 不能从另一个 preparedStatement 中使用,我在它之前试过了好的)我需要在准备语句中执行此操作。

所以前 3 部分创建临时 tables 因为在将参数设置为 preparedStatement I 运行 preparedStatement.execute() 3 次(我也试过 1....x次)然后我 运行 preparedStatement.execute() 但它 returns false 这意味着没有结果集。这是为什么?

PreparedStatement preparedStatement = conn.prepareStatement("select * into #tmp from tablex where ...\n" +
                "    select * into #tmp2 from #tmp where ...\n" +
                "    select * into #tmp3 from #tmp2 where ...\n" +
                "    select * from #tmp3\n" +
                "    select count(*) from #tmp3");

在上面,我添加了一个简单的插图。在这里,我需要使用准备好的语句获取第 4 次和第 5 次查询的结果。我该怎么做?

您正在执行的语句产生以下结果:

  1. 一个更新计数
  2. 一个更新计数
  3. 一个更新计数
  4. 一个结果集
  5. 一个结果集

execute(String)返回的布尔值false的含义是:

true if the first result is a ResultSet object; false if it is an update count or there are no results

这意味着您需要使用 getUpdateCount() 获取(第一个)更新计数,并使用 getMoreResults() 获取下一个结果(同样,这个 returns 一个布尔值相同的含义)。只有execute()getMoreResults()returnsfalsegetUpdateCount()returns-1才没有了结果。

您需要执行以下操作:

boolean nextResultSet = statement.execute(...);
int resultSetCount = 0;
while (true) {
  if (nextResultSet) {
    resultSetCount++;
    try (ResultSet rs = statement.getResultSet()) {
      // Do something with result set
    }
  } else {
    int updateCount = statement.getUpdateCount();
    if (updateCount == -1) {
      // no more results
      break;
    }
    // do something with update count
  }
  nextResultSet = statement.getMoreResults();
}

您可以通过添加 SET NOCOUNT ON 作为您执行的第一条语句来跳过部分复杂性;那么你将不会获得更新计数,只需要处理两个结果集。