gpt4 book ai didi

java - 通过 Java 获取创建和填充的 MSSQL 临时表的结果集

转载 作者:行者123 更新时间:2023-11-30 11:15:35 25 4
gpt4 key购买 nike

查询5

String query5 ="USE DBTwo\n" +
"DECLARE @temp_table table (column1 VARCHAR(60))\n" +
"insert into @temp_table (column1)\n" +
"select column1 from real_table (nolock)";

查询3

String query3 = "USE DBTwo\n" +
"select column1 from @temp_table";

连接;

ResultSet rs1;
Statement stmt;

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://192.168.131.10;" +"databaseName=DBOne;" +"user=" + "exuser" + ";" + "password="+"userpass" + ";" + "allowMultiQueries=true" + ";";
Connection con = DriverManager.getConnection(connectionUrl);
stmt = con.createStatement();

获取结果集;

   try {
int rowcount = stmt.executeUpdate(query5);
System.out.println(rowcount);

rs1 = stmt.executeQuery(query3);
while (rs1.next()) {
System.out.println(rs1.getString(1));
}
rs1.close();
}
catch (SQLException sqlex){
sqlex.printStackTrace();
}

SQL异常抛出以下错误;

com.microsoft.sqlserver.jdbc.SQLServerException: Must declare the table variable "@temp_table".`rowcount` return 7 

所以我成功填充了 @temp_table,我没有关闭 stmt 连接并尝试从此 @temp_table 获取结果集。但是 SQL 说我还没有声明这个表。怎么可能?

-- 已解决 --

只创建一个查询;

String query5 ="USE DBTwo\n" +
"DECLARE @temp_table table (column1 VARCHAR(60))\n" +
"insert into @temp_table (column1)\n" +
"select column1 from real_table(nolock)\n" +
"select column1 from @temp_table";

像下面这样获取多个结果;

try {
boolean result = stmt.execute(query5);
while (true)
if(result){
rs1 = stmt.getResultSet();
while (rs1.next()) {
System.out.println(rs1.getString(1));
}

} else {
int updateCount = stmt.getUpdateCount();
if (updateCount == -1){
break;
}
result = stmt.getMoreResults();
}
catch (SQLException sqlex){
sqlex.printStackTrace();
}

最佳答案

技术上遵循 JDBC 规范,您一次只能执行一条语句。 SQL Server JDBC 驱动程序允许在一次执行中执行多个语句是对标准的偏离。另请注意,像 USE databasename 这样的操作与 JDBC 中为此使用 Connection 方法(如 setCatalog)的建议相反,因为它可能带来驱动程序处于不一致状态。

关于你的具体问题,我有两种说法(我还没有验证是不是真正的原因):

  1. 您启用了自动提交。语句执行后,连接被提交,临时表被释放。
  2. 语句执行后,查询上下文由服务器处理,因此后续执行无法访问临时表。

这些都是理论,我认为 1. 是最有可能的。所以尝试禁用自动提交 (Connection.setAutoCommit(false))。

如果理论 2. 是原因,那么您需要一次执行它们,并处理多个结果(一个计数和一个结果集)。为此,您将使用 Statement.execute(...) 并处理多个结果。请参阅我对 Java SQL: Statement.hasResultSet()? 的回答有关如何处理多个结果的示例。

如果您不想禁用自动提交,最后一个解决方案可能也适用。

关于java - 通过 Java 获取创建和填充的 MSSQL 临时表的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25324331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com