如果表已存在,则创建表但删除它

时间:2012-02-15 18:45:01

标签: sql teradata create-table drop-table

我正在处理一个请求,我必须创建一个表来插入一些数据。所以,显然我将首先拥有一个删除表。在创建st之前但是当我第一次运行它时(在创建表之前),它会弹出一个错误,表示没有创建表,然后从这里创建表和goe son。所以每次第一次运行我的代码时,它都会在drop table st中弹出这个错误。有没有人有更好的主意?

有些事情,比如“如果表存在,则删除其他创建表” 我不确定我们将如何在sql中执行此操作

Drop table table_name; -------------->这里它第一次抛出一个错误,说表不存在。

创建表table_name

{so on};

顺便说一句,我正在研究Teradata,但简单的SQL逻辑会有所帮助。

3 个答案:

答案 0 :(得分:10)

您可以创建由SYSDBA或其他管理员级别用户拥有的存储过程,并具有执行以下操作的足够DROP TABLECREATE TABLE权限:

  1. 检查DBC.Tables以查看对象是否存在。
  2. 如果对象存在,请将其删除。
  3. 运行DDL以重新创建表:CREATE TABLE <TargetDB>.<TargetTable> AS <SourceDB>.<SourceTable> WITH DATA AND STATS;
  4. 通过接受有关是否应将数据和/或统计信息复制到新表的其他参数,可以使其更具动态性。

    如果你正在使用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 :(得分:1)

似乎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)

答案 2 :(得分:0)

尝试:Drop table IF EXISTS table_name;

然后继续创建表格,因为它将保证不再存在。