Java JDBC > Не возвращается результат для SQL запросов с переменными типа TABLE

393
31 августа 2017, 18:10

Выполняю SQL запросы через JDBC. Если запрос содержит переменную типа TABLE, то результат не возвращается:

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.

Пример SQL запроса:

DECLARE @Table TABLE (ID int); 
INSERT INTO @Table (ID)
    SELECT RecordID FROM tblData
SELECT * FROM @Table

Пример Java кода:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Full_Code {

    public static void main (String[] args) throws ClassNotFoundException, SQLException, FileNotFoundException, IOException
    {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        String Query = "", s;
        BufferedReader in = new BufferedReader(new FileReader("Query.txt"));
        while ((s = in.readLine())!=null) Query += s+"\n"; in.close();
        in.close();
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        con = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;databaseName=MyDB;user=VriL;password=987;");
        stmt = (Statement) con.createStatement();
        rs = stmt.executeQuery(Query);
        rs.close(); con.close(); stmt.close();
    }
}

Важно отметить:

  • Если выполняю тот же запрос руками (через MSSQL Server), то все работает.
  • Если запрос не содержит таких переменных, то все работает.
  • Экспериментальным путем выяснил, что все ломается на строке "INSERT INTO @Table (ID)".

Буду благодарен за любую помощь.

Answer 1

попробуйте SQL оформить так select @@TABLE as TABLE для примера так работает с @VERSION

    ResultSet rs_version;
    String msmsql_sql="select @@VERSION as VERSION";
    rs_version=stmt.executeQuery(msmsql_sql);
        while (rs_version.next()){
        out.println("<b>"+rs_version.getString("VERSION")+"</b>");
        }

с результатом

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows 10 Pro 6.3 (Build 14393: )

Answer 2

Приведенный вами скрипт является Transact-SQL выражением, соответственно в терминах JDBC он должен интерпретироваться как CallableStatement, то есть по сути вы должны скрипт сохранить как хранимую процедуру и вызывать ее через CallableStatement

READ ALSO
replaceAll - не удаляется подстрока

replaceAll - не удаляется подстрока

Нужно из строки "Привет, как дела? (siteru)" удалить подстроку (site

236
Intent во Fragment

Intent во Fragment

День добрыйПытаюсь открыть активити из фрагмента

256
Ошибка при Destroy`е Activity с Фрагментами

Ошибка при Destroy`е Activity с Фрагментами

Очень редкий баг, но его надо поправить(Пришел по багтрекеру после месяца использования пользователями)

242
Как написать правила для proguard?

Как написать правила для proguard?

Мне нужно было сделать имплементация proguard в проекте как было до

368