Создание и удаление временных таблиц последовательно в хранимой процедуре
Этот код не работает, когда я его запускаю, и я не понимаю, почему это не так, ошибка в том, что таблица уже существует, поэтому она выглядит не столько как реальная ошибка, сколько как ошибка в процессе проверки, возможно я ошибаюсь это что-то из процедуры, поэтому не работает везде, где есть go.
в своем первом вопросе я сильно упростил свою проблему
это были мои ограничения:
Я использую временные таблицы для связи между процедурами, в этом случае мне нужно было использовать одну и ту же процедуру дважды, но с разными параметрами, поэтому мне нужно было дважды информировать таблицу "#a". Потому что способ работы состоит в том, чтобы создать временную таблицу перед выполнением процедуры, и в этой форме процедура будет знать, нужно ли ей выбирать или информировать таблицу. Если он информирует таблицу, он также отвечает за создание столбца (это делается для того, чтобы избежать зависимости между процедурами). поэтому я не могу повторно использовать ту же таблицу, потому что столбцы уже созданы.
Решение, которое я нашел, состояло в том, чтобы создать другую хранимую процедуру, которая будет выполнять работу для второй части, я мог бы изменить процедуру sp_a, но у меня нет фактического контроля над ней.
CREATE PROCEDURE zzzzz_testtodelete
AS
BEGIN
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 1
.....
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
Exec sp_a
@a = 2
.....
DROP TABLE #a
END
Это нормально или это ошибка в sql?
3 ответа
Это нормально. Здесь происходит ошибка компиляции, а не ошибка времени выполнения. Это связано с тем, что при разборе пакета SQL Server видит, что вы уже создали #a
, поэтому создание его снова приведет к ошибке. Опять же, эта ошибка не ошибка времени выполнения, а ошибка компиляции. Тестировать:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
Обратите внимание, что TESTING
не печатается, так как пакет даже не выполняется из-за ошибки компиляции.
Положить GO
между первым DROP
и второй CREATE
исправит проблему:
PRINT 'TESTING'
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
GO
CREATE TABLE #a(idtmp bit)
DROP TABLE #a
Это потому, что у вас есть две отдельные партии сейчас. SQL Server анализирует и проверяет sql запросы по пакетам.
Только после редактирования ОП он / она заявляет, что это используется в хранимой процедуре. В этом случае нет реального решения. Тем не менее, это ошибка компиляции. Код не выполняется.
Дополнительно, согласно BOL:
Если внутри одной хранимой процедуры или пакета создается более одной временной таблицы, они должны иметь разные имена.
Обходной путь должен использовать разные имена для таблиц. Или просто обрежьте таблицу после первого использования.
Попробуй так
IF Object_id('tempdb..#temp') is not null
Drop table #temp
create table #temp (table columns as desired)
Временные таблицы менее эффективны в хранимых процедурах, попробуйте использовать типы таблиц, вам не нужно их удалять.
DECLARE @a TABLE (idtmp bit)