Как показал мой комментарий, я собираюсь предположить, что ответ заключается в том, что вы используете разные имена таблиц #temp для каждого создаваемого вами объекта. Это все равно, что сказать доктору: «Мне больно, когда я так поступаю». Его вероятный ответ будет: «Прекрати это делать!»
Причина, по которой это проблема, заключается в том, что синтаксический анализатор SQL Server пытается проанализировать весь пакет за один раз. Он ясно видит, что вы пытаетесь создать одну и ту же таблицу #temp несколько раз, но игнорирует промежуточную команду DROP
(я не могу точно сказать, почему это так, поскольку у меня нет доступа к исходному коду ). Это та же самая причина, по которой вы не можете сделать это:
IF (1=1)
CREATE TABLE #foo(i INT);
ELSE
CREATE TABLE #foo(i VARCHAR(32));
Парсер видит два идентичных имени, но не может следовать логике IF/ELSE
.
В дополнение к избежанию проблем, связанных с множеством таблиц #temp с одинаковыми именами, вызывает синтаксический анализатор, еще одно преимущество использования уникальных имен заключается в том, что они могут использоваться повторно, если вы явно не удаляете их. Это снизит нагрузку на базу данных tempdb с точки зрения метаданных / блокировки.