【问题标题】:Create table but Drop it if the table exists already创建表但如果表已存在则删除它
【发布时间】:2012-03-07 03:29:46
【问题描述】:

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

类似“如果表存在则删除否则创建表”
我不确定我们将如何在 sql 中执行此操作

Drop table table_name;-------------->这里第一次报错说table不存在。

创建表table_name

{ 以此类推};

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

【问题讨论】:

标签: sql teradata create-table drop-table


【解决方案1】:

您可以创建由 SYSDBA 或其他具有足够 DROP TABLECREATE 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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 仅供参考 - 这种方法也适用于 SAS Enterprise Guide,至少在表存在时删除表的部分(不需要创建它们)。
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多