Не удается добраться до временной таблицы с использованием подготовленного оператора во второй раз - PullRequest
0 голосов
/ 13 декабря 2018

Я использую временные таблицы внутри своего кода для [некоторой долгой последовательности причин здесь] в SQL Server, Java.Я выполнял свои sql запросы с использованием объекта Stament в Java.Однако недавно я решил использовать PreparedStatement, чтобы избежать внедрения.

Моя проблема заключается в том, что когда я создаю временную таблицу с использованием PreparedStatement, я не могу снова получить ее с тем же подготовленным оператором.Вот простая иллюстрация:

sql = "select * into #someTable from (select someColumns from someOtherTable where smth = ? and smth2 = ?)"
PreparedStatement preparedStatement = conn.prepareStatement(sql);
for(int i=0; i<parameters.size(); i++){
   preparedStatement.setString(i+1, parameters.get(i).toString());
}

this.rs = preparedStatement.executeQuery();

Пока здесь все в порядке.После получения ResultSet и выполнения каких-либо действий с ним или без получения resultSet только для preparedStatement.execute() не имеет значения, я не могу снова достичь объекта #someTable.

sql = "select count(*) from #someTable"
preparedStatement = conn.prepareStatement(sql);
this.rs = preparedStatement.executeQuery();

Здесь this.rs = preparedStatement.executeQuery(); часть дает 'Invalid object name #someTable'.Я делаю все вышеперечисленное с использованием только одного объекта Connection и без его закрытия или повторного открытия.Мне нужно снова использовать эту временную таблицу.Есть ли способ создать временную таблицу с объектом PreparedStatement в Java и повторно использовать эту временную таблицу снова и снова?С уважением,

1 Ответ

0 голосов
/ 13 декабря 2018

Временная таблица, которую вы создаете в первом операторе, существует для области действия \ времени жизни этого запроса.Как только вы вызываете другой запрос, вы попадаете в другую область, поэтому он больше не присутствует, поскольку он был бы очищен.

Решения либо делают 2 запроса в одном вызове (не очень), либосоздайте глобальную временную таблицу, к которой можно получить доступ вторым запросом (все еще не большой).

Лучшее решение - создать хранимую процедуру, которая делает все, что вам нужно, с созданием временной таблицы, запросом и приведением в порядок.инкапсулирован в процедуру.

PS Я не вижу окружающего кода, но остерегайтесь SQL-инъекций при построении запросов в таком коде.

Информация, связанная с данной: Область применения временных таблицв SQL Server

...