即使SQL Server中有结果集,PreparedStatement.execute()也会返回false?

时间:2019-01-02 12:48:18

标签: java sql-server jdbc temp-tables

我的sql查询由5个相互紧密联系的部分组成。第一部分创建一个临时表,第二部分使用该临时表并创建另一个临时表,第三部分使用在第二部分中创建的临时表,然后再次创建另一个临时表。第四部分从第三临时表中选择一些数据,第五部分从第三临时表中选择计数。

由于临时表仅在preparedStatement中可用(我的意思是,由preparedStatement创建的临时表无法在另一个preparedStatement中使用,因此我尝试过之前还没做好),我需要在prepare语句中进行操作

因此,前3个部分创建了临时表,因为在将参数设置为prepareStatement之后,我运行了preparedStatement.execute() 3次(我也尝试了1 .... x次),然后运行了prepareStatement.execute( ),但返回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 个答案:

答案 0 :(得分:1)

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

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

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

  

true(如果第一个结果是ResultSet对象); false(如果是)   更新计数或没有结果

这意味着您需要使用getUpdateCount()来获取(第一个)更新计数,并使用getMoreResults()来获取下一个结果(同样,这将返回具有相同含义的布尔值)。仅当execute()getMoreResults()返回false ,并且 getUpdateCount()返回-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作为执行的第一条语句来跳过这种复杂性的一部分;那么您将不会获得更新计数,只需要处理两个结果集即可。