5

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

诸如“如果表存在则删除其他创建表”之类的东西
我不确定我们将如何在 sql 中执行此操作

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

创建表 table_name

{ 很快 };

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

4

2 回答 2

11

您可以创建由 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;
于 2012-02-15T19:45:35.047 回答
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)
于 2016-05-31T09:19:13.393 回答