Создать таблицу, но удалить ее, если таблица уже существует - PullRequest
4 голосов
/ 15 февраля 2012

Я работаю над запросом, в котором мне нужно создать таблицу для вставки некоторых данных.Итак, очевидно, у меня сначала будет таблица удаления st.до создания ул.но когда я запускаю это в первый раз (до того, как таблица может быть создана), появится всплывающее сообщение об ошибке, говорящее о том, что таблица не создана, а затем создает таблицу и идет отсюда.Поэтому каждый раз, когда кто-нибудь запускает мой код в первый раз, он выдает эту ошибку в удаленной таблице st.У кого-нибудь есть идея получше?

Что-то вроде "если таблица существует, тогда отбросьте создание таблицы"
Я не уверен, как мы собираемся сделать это в sql

Удалить таблицу table_name; --------------> здесь впервые выдается сообщение о том, что таблица не существует.

Создать таблицу table_name

{так далее};

Кстати, я работаю над Teradata, но простая логика sql поможет.

Ответы [ 3 ]

10 голосов
/ 15 февраля 2012

Вы можете создать хранимую процедуру, принадлежащую SYSDBA или другому пользователю уровня администратора с соответствующими правами DROP TABLE и CREATE TABLE, которая выполняет следующие действия:

  1. Проверьте DBC.Tables, чтобы увидеть, существует ли объект.
  2. Если объект существует, отбросьте его.
  3. Запустите DDL, чтобы воссоздать таблицу: CREATE TABLE <TargetDB>.<TargetTable> AS <SourceDB>.<SourceTable> WITH DATA AND STATS;

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

Если вы используете BTEQ, вы можете сделать что-то подобное (синтаксис команды BTEQ может быть немного смещен, но достаточно близок, чтобы понять суть):

SELECT 1 
FROM DBC.TABLES 
WHERE DatabaseName = '<TargetDB>'
  AND TableName = '<TargetTable>'
  AND TableKind = 'T' /* Make sure it is in fact a table, not a view, macro etc */


.IF ACIVITYCOUNT = 0 THEN GOTO CreateNewTable;

DROP TABLE <TargetDB>.<TargetTable>;

.IF ERRORCODE = 3807 THEN GOTO CreateNewTable; /* Table dropped by another process? */
.IF ERRORCODE > 0 THEN .QUIT ERRORCODE; /* Unexpected error */

.LABEL CreateNewTable;

CREATE <TargetDB>.<TargetTable> AS <SourceDB>.<SourceTable> WITH DATA AND STATISTICS;
1 голос
/ 31 мая 2016

Кажется, что SAS proc sql не может сделать это напрямую, как T-SQL. В любом случае, вы можете написать макрос, чтобы проверить, существует ли набор данных. Если так, бросьте это сначала. Затем создайте таблицу. Как следующий код.

%macro checkDrop(tmpData);
%if %SYSFUNC(exist(&tmpData)) %then %do;
    proc sql;
    drop table &tmpData;
    quit;
    %end;
    %else %do;
    proc sql;
    create table &tmpData (a numberic, b numberic);
    %end;
%mend;
%checkDrop(tmp)
0 голосов
/ 15 февраля 2012

Попробуйте: Drop table IF EXISTS table_name;

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

...