我正在处理一个请求,我必须创建一个表来插入一些数据。所以,显然我将首先拥有一个删除表。在创建st之前但是当我第一次运行它时(在创建表之前),它会弹出一个错误,表示没有创建表,然后从这里创建表和goe son。所以每次第一次运行我的代码时,它都会在drop table st中弹出这个错误。有没有人有更好的主意?
有些事情,比如“如果表存在,则删除其他创建表” 我不确定我们将如何在sql中执行此操作
Drop table table_name; -------------->这里它第一次抛出一个错误,说表不存在。
创建表table_name
{so on};
顺便说一句,我正在研究Teradata,但简单的SQL逻辑会有所帮助。
答案 0 :(得分:10)
您可以创建由SYSDBA或其他管理员级别用户拥有的存储过程,并具有执行以下操作的足够DROP TABLE
和CREATE TABLE
权限:
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 :(得分: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;
然后继续创建表格,因为它将保证不再存在。