У меня есть своего рода код, выделенный как «связные блоки», которые я могу снова и снова вставлять в более длинный «скрипт конфигурации», и один из шаблонов, которые я использую, таков:
CREATE TABLE #WidgetSetting
(
WidgetID bigint not null,
Name nvarchar(100) not null,
Value nvarchar(max) not null,
CreateDate datetime not null
)
INSERT VALUES
MERGE TABLES
DROP TABLE #WidgetSetting
Но теперь SSMS жалуется, что объект уже существует к следующему CREATE TABLE
пожару. Что дает?
Я думаю, что очевидно, что мне придется объявить таблицу один раз в начале скрипта, усечь вместо удаления, но, естественно, разочаровывает невозможность просто удалить таблицу и снова использовать то же имя.
sql-server
sql-server-2008-r2
t-sql
ssms
Jcolebrand
источник
источник
Ответы:
Нет, парсер не позволит вам создать одну и ту же таблицу #temp дважды в одном пакете (и это не имеет никакого отношения к SSMS). Даже не имеет значения, можно ли создать только одну копию таблицы #temp; например, в следующей условной логике, которая для людей, очевидно, могла когда-либо выполнять только одну ветку, SQL Server не может этого увидеть:
И чтобы доказать, что SSMS не жалуется во время компиляции (распространенное заблуждение):
Выдает точно такую же ошибку, даже если SSMS не пытается анализировать или проверять динамический SQL перед отправкой его на сервер через
sp_executesql
.Исправление, конечно, состоит в том, чтобы повторно использовать одну и ту же таблицу #temp вместо удаления, каждый раз использовать другую таблицу #temp или не использовать таблицы #temp в первую очередь.
Это не то, что вы должны ожидать от SQL Server для лучшей обработки. Другими словами, привыкните к любому обходному решению, с которым вы решите.
Смотрите также этот связанный ответ о переполнении стека, который дает альтернативное объяснение:
источник