Sql удалить временную таблицу: MS SQL Server и T-SQL

Удаление временных таблиц в MSSQL


  • Новые

  • Лучшие

  • Все
Удаление временных таблиц в MSSQL

MS SQL — по необходимости

Иногда возникает необходимость, в ходе работы процедуры, удалить временно созданную таблицу которая может быть либо создана либо нет, тогда не достаточно просто написать например drop table #myTempTable — потому что в случае если таблицы не существует то запрос не выполнится и выдаст ошибку. Пример ниже показывает как правильно удалять временные таблицы в таком случае:

if exists (
	select * from tempdb.dbo.sysobjects o
	where o.xtype in ('U') 

	and o.id = object_id(N'tempdb..#myTempTable')
)
BEGIN
  DROP TABLE #myTempTable; 
END



таблицы
MSSQL
программирование
Базы данных


  • Популярное

Установка русской кодировки на уже созданную базу данных (смена COLLATION)

Полезный пример изменения кодировки (COLLATION) на уже созданной базе данных. В данном примере устан (читать далее…)


435  


Курсоры в MSSQL — перебор выборки в цикле.

Команды манипулирования данными SELECT, UPDATE, DELETE работают сразу с группами строк. Эти группы, (читать далее…)


322  


Чистка логов базы данных MSSQL

Вообще процесс чистки логов должен проходить планово, и следить за этим и настраивать должен професс (читать далее…)


167  


MSSQL — передача таблицы или списка значений в процедуру ( C# .NET )

Часто бывает необходимость передать за один раз некоторый набор данных в процедуру, в этой публикаци (читать далее. ..)


126  


Пример MERGE в MSSQL T-SQL

Простой пример MERGE для TSQL. В примере подразумевается, что мы оперируем двумя одинаковыми по стру (читать далее…)


109  

Удалить временную таблицу sql – Telegraph

Удалить временную таблицу sql

Удаление таблицы

=== Скачать файл ===

DROP TABLE (Transact-SQL)

Удалить временную таблицу

Регистрация Выслать повторно письмо для активации Что даёт регистрация на форуме? RU Системы, Сети, Технологии Базы данных Базы данных: Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных — обсуждаем в разделе ‘ Базы данных: Убедительная просьба — соблюдать ‘ Правила форума ‘ и не пренебрегать ‘ Правильным оформлением своих тем ‘. Прежде, чем создавать тему, имеет смысл заглянуть в раздел ‘ Базы данных: FAQ ‘, возможно там уже есть ответ. Я знаю только то, что ничего не знаю. Цитата Временные таблицы Можно создавать локальные и глобальные временные таблицы. Локальные временные таблицы видимы только во время текущего сеанса, а глобальные — во всех сеансах. Временные таблицы не подлежат секционированию. CREATE TABLE MyTempTable cola INT PRIMARY KEY INSERT INTO MyTempTable VALUES 1. CREATE TABLE MyTempTable cola INT PRIMARY KEY. Проверка на существование таблица неверна. Она создается в базе tempdb и имеет несколько иное название, зависящее от контекста. Вот например в Interbase я видел отлиный отладцик, который пошпгово выполняет запрос и показывает результаты команд и переменных, ессть ли такая фича MSSQLServer? А подскажите пожалуйста, как отлаживать запросы на сервере с помощью VS ? Предыдущая тема Базы данных: Powered by Invision Power Board U v1. При втором запуске запроса пишет: Почему не удаляется временная таблица? Как удалить временную таблицу??? CREATE TABLE MyTempTable cola INT PRIMARY KEY INSERT INTO MyTempTable VALUES 1 Если в пределах одной хранимой процедуры или пакета создается более одной временной таблицы, им должны быть присвоены разные имена. Если локальная временная таблица создается хранимой процедурой или приложением, которые одновременно могут выполняться несколькими пользователями, Database Engine должно иметь возможность различать таблицы, созданные разными пользователями. Database Engine делает это путем внутреннего присоединения числового суффикса к имени каждой локальной временной таблицы. Полное имя временной таблицы, хранящееся в таблице sysobjects базы данных tempdb, состоит из имени таблицы, заданного инструкцией CREATE TABLE, и сформированного системой числового суффикса. Временные таблицы автоматически удаляются при выходе за пределы области определения, если не удалять их явно с помощью инструкции DROP TABLE: Локальная временная таблица, созданная хранимой процедурой, удаляется автоматически при завершении хранимой процедуры. К этой таблице могут обращаться любые вложенные хранимые процедуры, выполняемые хранимой процедурой, создавшей таблицу. Процесс, вызвавший хранимую процедуру, создавшую таблицу, к этой таблице обращаться не может. Все прочие локальные временные таблицы удаляются автоматически в конце текущего сеанса. Глобальные временные таблицы автоматически удаляются при завершении сеанса, создавшего таблицу, и прекращении обращения к ним всех прочих задач. Связь между задачей и таблицей поддерживается только на время выполнения отдельной инструкции Transact-SQL. Это означает, что глобальная временная таблица удаляется после выполнения последней инструкции языка Transact-SQL, активно обращавшейся к ней во время завершения создавшего таблицу сеанса. Локальная временная таблица, созданная хранимой процедурой или триггером, может иметь то же имя, что и временная таблица, созданная до вызова хранимой процедуры или триггера. Однако если запрос обращается к временной таблице и одновременно существует две таблицы с одинаковым именем, не определено, к какой из таблиц будет направлен запрос. Вложенные хранимые процедуры могут также создавать временные таблицы с тем же именем, что и временная таблица, созданная вызывающей хранимой процедурой. Однако для применения изменений к таблице, созданной во вложенной процедуре, эта таблица должна иметь ту же структуру с теми же именами столбцов, что и таблица, созданная в вызывающей процедуре. Это показано в следующем примере. Если во временной таблице указано ограничение FOREIGN KEY, инструкция возвращает предупредительное сообщение, указывающее на то, что ограничение было пропущено. При этом таблица создается без ограничений FOREIGN KEY. В ограничениях FOREIGN KEY обращение к временным таблицам недопустимо. Рекомендуется использовать вместо временных таблиц табличные переменные. Временные таблицы полезны в случаях, когда индексы должны быть заданы по ним явно, или когда значения таблицы должны быть видимы нескольким хранимым процедурам или функциям. В общем случае использование табличных переменных приводит к более эффективной обработке запросов. Временная таблица удалится по завершению. А прога которая выполняет этот запрос, соеденение не рвёт пока жива, а запрос выполняет по таймеру А если сделать её хранимой процедурой, то после выполнения запроса она останется на севере и её тоже нужно будет удалять. А в одном запросе это сделать не получится, я уже пробовал Используй для этого, например, Query Analyzer. Правой кнопкой щелкаешь на хранимке и выбираешь debug.

В страшной стране мы живем в россии

Правила пользования жилымии вспомогательными помещениями рб

Где отдохнутьв пензенской области недорого

Халязион нижнего века видео

Как сделать крем из рикотты для торта

Давление при климаксе сколько времени длится

Назовите авторские характеристики политики

Куриный суп с овощами

Каталог немецкой одежды бонприкс

Склонение личных местоимений испанский

Сиалор инструкция для детей до года

Лазерный нивелир леруа

Тестна психический портрет

Topic стихи шевченко о хохлах

Кру красноярск где находится

Платифиллина гидротартрат инструкция по применению в ампулах

Какие виды сайдинга бывают

Структура интегрированной группы

Как правильно уволиться после отпуска

Бирюк характеристика героя

Как удалить временные таблицы в SQL Server

Временные таблицы, также известные как временные таблицы, широко используются администраторами и разработчиками баз данных. Однако может возникнуть необходимость удалить временную таблицу перед ее созданием. Обычной практикой является проверка существования временной таблицы. Таким образом, мы можем устранить ошибку «В базе данных уже есть объект с именем #temptablename» при создании временной таблицы.

Временные таблицы

Временные таблицы используются для хранения данных в течение определенного периода времени в SQL Server. Многие функции временных таблиц аналогичны постоянным таблицам. Например, мы можем создавать индексы, статистику и ограничения для этих таблиц, как мы это делаем для сохраняемых таблиц.

Типы временных таблиц влияют на жизненный цикл временных таблиц. Теперь мы взглянем на них.

Типы временных таблиц

Локальные временные таблицы: имя этого типа временной таблицы начинается с одного символа хэштега «#», и они видны только в созданном сеансе. Если сеанс, который создал локальную временную таблицу, закрыт, временная таблица будет автоматически удалена SQL Server.

Следующий запрос создаст локальную временную таблицу:

1

2

3

4

5

6

7

8

9 9 0005

10

CREATE TABLE #LocalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

)

90 002 GO

ВСТАВИТЬ В ЗНАЧЕНИЯ #LocalCustomer(1, «Кэтлин Монтропс», «30 Crescent Avenue DRUMMUIR CASTLE»)

GO

ВЫБРАТЬ * ИЗ #LocalCustomer

Глобальные временные таблицы: Имя временной таблицы этого типа начинается с двойного символа хэштега «##», и к ней можно получить доступ из всех других подключений. В этом основное различие между локальными и глобальными временными таблицами. Если сеанс, в котором была создана глобальная временная таблица, закрыт, глобальная временная таблица будет удалена автоматически.

Следующий запрос создаст глобальную временную таблицу:

1

2

3

4

5

6

7

8

9 9 0005

10

CREATE TABLE ##GlobalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

)

9 0002 GO

ВСТАВИТЬ В ##GlobalCustomer VALUES(1,’Adam Tottropx’ ,’30  Mztom Street LONDON’)

GO

SELECT * FROM ##GlobalCustomer

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

Локальные временные таблицы

Глобальные временные таблицы

Имена начинаются с одного символа хэштега «#».

Имена начинаются с двойного символа хэштега «##».

Доступ к таблицам возможен только из сеанса, в котором таблица была создана.

Доступ к таблицам возможен из всех других сеансов.

Не может быть удален другими соединениями.

Может быть сброшен другими соединениями.

Где хранятся временные таблицы?

Когда мы создаем временную таблицу, они создаются в базе данных tempdb . После создания локальной временной таблицы, если мы проверим папку временных таблиц в tempdb , мы увидим странное имя таблицы. С другой стороны, глобальные временные таблицы создаются с их исходными именами.

SQL Server добавляет случайные числа в конце имен переменных локальной таблицы. Идея этой логики довольно проста. Несколько различных подключений могут создавать локальные временные таблицы с одним и тем же именем, поэтому SQL Server автоматически добавляет случайное число в конце имени временной таблицы этого типа. Таким образом, SQL Server избегает конфликтов одинаковых имен.

Нет никаких сомнений в том, что после этих знаний, если мы хотим удалить любую временную таблицу, мы должны работать с базой данных tempdb .

Как удалить временные таблицы?

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

Чтобы добиться этой проверки, мы можем использовать различные методы. Давайте изучим эти техники:

Использование функции OBJECT_ID для проверки существования временной таблицы

Функция OBJECT_ID используется для получения идентификационного номера объекта базы данных. Функция OBJECT_ID может принимать имя объекта в качестве параметра, поэтому мы можем использовать эту функцию для проверки существования любого объекта в конкретной базе данных.

Следующий запрос проверит наличие таблицы #LocalCustomer в базе данных tempdb , и если она существует, она будет удалена.

Для локальных временных таблиц:

1

2

3

4

5

6

7

8

9 9 0005

10

11

12

ЕСЛИ OBJECT_ID(N’tempdb..#LocalCustomer’) НЕ NULL

BEGIN

DROP TABLE #LocalCustomer

END

GO

 

СОЗДАТЬ ТАБЛИЦУ #LocalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

)

Для глобальных временных таблиц:

1

2

3

4

5

6

7

8

9 9 0005

10

11

12

ЕСЛИ OBJECT_ID(N’tempdb.. ##GlobalCustomer’) НЕ NULL

BEGIN

DROP TABLE ##GlobalCustomer

END

GO

 

CREATE TABLE ##GlobalCustomer

( 90 005

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

)

Использование таблицы sys.tables для проверки существования временной таблицы

В этом методе мы проверим наличие временной таблицы с помощью sys.tables , поскольку эта таблица возвращает пользовательские таблицы в соответствующей базе данных.

Для локальных временных таблиц:

1

2

3

4

5

6

7

8

9 9 0005

10

11

ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ [имя] ИЗ tempdb.sys.tables, ГДЕ [имя] например «#LocalCustomer%»)

НАЧАЛО

   DROP TABLE #LocalCustomer;

КОНЕЦ;

 

CREATE TABLE #LocalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

90 002 )

Для глобальных временных таблиц:

1

2

3

4

5

6

7

8

9 9 0005

10

11

ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ [имя] ИЗ tempdb. sys.tables, ГДЕ [имя] как ‘##GlobalCustomer%’)

НАЧАЛО

   DROP TABLE ##GlobalCustomer ;

КОНЕЦ;

 

CREATE TABLE ##GlobalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

9 0002 )

Как мы видим, мы проверяем наличие #LocalCustomer в базе данных tempdb , и если она существует, мы должны ее удалить. На этом этапе нам нужно подчеркнуть одну проблему: имя таблицы ищется с помощью оператора LIKE , и мы также добавили подстановочный знак в конце имени временной таблицы. Как мы уже говорили, локальные временные таблицы создаются со случайным суффиксом, поэтому мы не можем знать их точное имя.

Использование инструкции DROP TABLE IF EXISTS

Это последняя техника удаления временной таблицы, которую мы изучим. DROP TABLE IF EXISTS Оператор проверяет существование таблицы и, если она существует, удаляет ее. Мы должны подчеркнуть один момент в этом заявлении; он работает на SQL Server 2016 или более поздней версии SQL Server. В следующем запросе, DROP TABLE IF EXISTS , мы проверим существование таблицы #LocalCustomer , и если она существует, она будет удалена.

Для локальных временных таблиц:

1

2

3

4

5

6

7

8

DROP TABLE IF EXISTS  #LocalCustomer

GO

CREATE TABLE #LocalCustomer

(

CustomerId int,

CustomerName varchar(50),

CustomerAdress varchar(150)

)

Для глобальных временных таблиц:

1

2

3

4

5

6

7

8

DROP TABLE IF EXISTS  ##GlobalCustomer

GO

CREATE TABLE ##GlobalCustomer

(

CustomerId int,

CustomerName varchar(50 ),

CustomerAdress varchar(150)

)

В следующей таблице мы можем увидеть все методы, которые мы кратко упомянули:

Как удалить временные таблицы

Использование функции OBJECT_ID

1

2

3

4

5

6

7

8

9 9 0005

10

ЕСЛИ OBJECT_ID(N’tempdb. .#TempTableName’) НЕ NULL

НАЧАЛО

DROP TABLE #TempTableName

END

GO

 

CREATE TABLE #TempTableName

(

Col1 VARCHAR(100)

)

Использование системных таблиц

1

2

3

4

5

6

7

8

9 9 0005

ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ [имя] ИЗ tempdb.sys.tables, ГДЕ [имя] как ‘#TempTableName%’)

НАЧАЛО

   УДАЛИТЬ ТАБЛИЦУ #TempTableName;

КОНЕЦ;

 

CREATE TABLE #TempTableName

(

Col1 VARCHAR(100)

)

Использование

Оператор DROP TABLE IF EXISTS

1

2

3

4

5

6

DROP TABLE IF EXISTS  #TempTableName

GO

CREATE TABLE #TempTableName

(

Col1 VARCHAR(100)

) 90 005

Заключение

В этой статье мы изучили основы временных таблиц и обсудили методы удаления временных таблиц в SQL Server. По моему мнению, лучше всего использовать оператор DROP TABLE IF EXISTS , но мы можем легко использовать и другие альтернативные методы.

  • Автор
  • Последние сообщения

Esat Erkec

Esat Erkec — специалист по SQL Server, который начал свою карьеру более 8 лет назад в качестве разработчика программного обеспечения. Он является сертифицированным экспертом по решениям Microsoft для SQL Server.

Большая часть его карьеры была посвящена администрированию и разработке баз данных SQL Server. Его текущие интересы связаны с администрированием баз данных и бизнес-аналитикой. Вы можете найти его на LinkedIn.

Просмотреть все сообщения от Esat Erkec

Последние сообщения от Esat Erkec (посмотреть все)

sql — Удалить временную таблицу, если она существует

спросил

Изменено
4 года, 10 месяцев назад

Просмотрено
460 тысяч раз

У меня есть две строки кода в SQL, которые создают две таблицы на лету, мне нужно сделать что-то вроде

 ЕСЛИ ТАБЛИЦА СУЩЕСТВУЕТ
    БРОСЬТЕ ЭТО И СОЗДАЙТЕ ЕЕ СНОВА
ЕЩЕ
    СОЗДАТЬ ЭТО
 

мои строки следующие

 CREATE TABLE ##CLIENTS_KEYWORD(client_id int)
CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)
 

как я могу применить эту концепцию для этих двух таблиц в моей процедуре?

  • sql
  • sql-сервер

2

Из SQL Server 2016 вы можете просто использовать

 УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ ##CLIENTS_KEYWORD
 

В предыдущих версиях можно использовать

 IF OBJECT_ID('tempdb. .##CLIENTS_KEYWORD', 'U') НЕ NULL
/*Тогда он существует*/
УДАЛИТЬ ТАБЛИЦУ ##CLIENTS_KEYWORD
СОЗДАТЬ ТАБЛИЦУ ##CLIENTS_KEYWORD
(
   client_id INT
)
 

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

 ЕСЛИ OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') НЕ НУЛЬ
  ОБРЕЗАТЬ ТАБЛИЦУ ##CLIENTS_KEYWORD
ЕЩЕ
  СОЗДАТЬ ТАБЛИЦУ ##CLIENTS_KEYWORD
  (
     client_id INT
  )
 

7

Проверить существование, получив его object_id:

, если object_id('tempdb..##clients_keyword') не равен нулю
    удалить таблицу ##clients_keyword
 

То, что вы просили:

 ЕСЛИ OBJECT_ID('tempdb..##CLIENTS_KEYWORD') НЕ NULL
    НАЧИНАТЬ
       УДАЛИТЬ ТАБЛИЦУ ##CLIENTS_KEYWORD
       CREATE TABLE ##CLIENTS_KEYWORD(client_id int)
    КОНЕЦ
ЕЩЕ
   CREATE TABLE ##CLIENTS_KEYWORD(client_id int)
ЕСЛИ OBJECT_ID('tempdb..##TEMP_CLIENTS_KEYWORD') НЕ NULL
    НАЧИНАТЬ
       УДАЛИТЬ ТАБЛИЦУ ##TEMP_CLIENTS_KEYWORD
       CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)
    КОНЕЦ
ЕЩЕ
   CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)
 

Так как вы всегда будете создавать таблицу, независимо от того, удалена таблица или нет; немного оптимизированное решение:

 IF OBJECT_ID('tempdb.