JDBC SQL SERVER: инструкция не вернула результирующий набор

Я выполняю следующий запрос из Microsoft SQL Server Studio, который отлично работает и отображает результаты:

SELECT *
INTO   #temp_table
FROM   md_criteria_join
WHERE  user_name = 'tecgaw'

UPDATE #temp_table
SET    user_name = 'tec'
WHERE  user_name != 'tec'

SELECT *
FROM   md_criteria_join
WHERE  user_name = 'tec'
   AND view_name NOT IN (SELECT view_name
                         FROM   md_criteria_join
                         WHERE  user_name = 'tecgaw')
UNION
SELECT *
FROM   #temp_table
ORDER  BY view_name,
      user_name,
      crit_usage_seq,
      crit_join_seq 

однако, если я выполняю тот же запрос в Java, возникает исключение с указанием "оператор не вернул результирующий набор." вот код Java:

statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());

это потому, что я не могу выполнить несколько SQL-запросов в одном операторе (т. е., Создание #temp_table, обновляя его, а затем используя для него мой оператор select)?

4 ответов


Я нашел аналогичный вопрос в StackOverflow здесь. Вы должны включить соединение для поддержки нескольких операторов и разделить их с помощью ;. Конкретные примеры см. В этом ответе. Однако это только для MySql.

также я думаю, что вы можете переписать свой SQL в один запрос

SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
       user_name = 'tec' 
   AND view_name NOT IN (
       SELECT view_name 
       FROM md_criteria_join 
       WHERE user_name = 'tecgaw')
   )
   OR user_name = 'tecgaw' 
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq

другой вариант-переместить операторы в хранимую процедуру и вызвать ее из JDBC с помощью CallableStatement

или может быть, вы должны попробовать выполнение его с несколькими операторами jdbc, как это

Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();

обратите внимание, что вам нужно закрыть ресурсы и, возможно, для повышения производительности вы можете использовать методы addBatch и executeBatch


JDBC путается по количеству строк.

вам нужно использовать SET NOCOUNT ON.


использовать execute заявление обработка данных как вставить, обновить и удалить и executeQuery на сбор данных как выберите

Я предлагаю вам разделить вашу программу на два заявления одно execute и executeQuery.

если вы не хотите этого делать, попробуйте разделить операторы с запятой. Но я не уверен в этом действии, если это дает вам resultset или нет.


в ms sql вам также нужно установить nocount справа в начале хранимой процедуры вместе с завершением инструкции select / update/ insert block С помощью ";"