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


96

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

IF TABLE EXISTS 
    DROP IT AND CREATE IT AGAIN
ELSE
    CREATE IT

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

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

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



Ответы:


200

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

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

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

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
/*Then it exists*/
DROP TABLE ##CLIENTS_KEYWORD
CREATE TABLE ##CLIENTS_KEYWORD
(
   client_id INT
)

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

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 


хм, почему-то, когда я его выполняю, он говорит, что ## CLIENTS_KEYWORD - недопустимое имя объекта
user710502

@user - На какой версии SQL Server вы работаете? Я использую SQL Server 2008 и (думаю, я) тестировал оба случая, когда таблица существовала и не существовала. Возможно, потребуется обернуть создание файла, EXECчтобы синтаксический анализатор не жаловался на предыдущие версии. ie useEXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
Мартин Смит

+1OBJECT_ID IS NULLвместо tempdb.sys.tablesзапроса.
dakab

1
@TobySpeight - речь идет о временных таблицах. Большинство из этих пунктов имеют ограниченное отношение к этому.
Мартин Смит

13

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

if object_id('tempdb..##clients_keyword') is not null
    drop table ##clients_keyword

0

Вы просили:

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD') IS NOT NULL
    BEGIN
       DROP TABLE ##CLIENTS_KEYWORD

       CREATE TABLE ##CLIENTS_KEYWORD(client_id int)

    END
ELSE
   CREATE TABLE ##CLIENTS_KEYWORD(client_id int) 

IF OBJECT_ID('tempdb..##TEMP_CLIENTS_KEYWORD') IS NOT NULL
    BEGIN
       DROP TABLE ##TEMP_CLIENTS_KEYWORD

       CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)

    END
ELSE
   CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int) 

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

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD') IS NOT NULL
   DROP TABLE ##CLIENTS_KEYWORD

CREATE TABLE ##CLIENTS_KEYWORD(client_id int) 

IF OBJECT_ID('tempdb..##TEMP_CLIENTS_KEYWORD') IS NOT NULL
   DROP TABLE ##TEMP_CLIENTS_KEYWORD

CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int) 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.