I am working on a request where I have to create a table to insert some data. So, obviously I will have first have a delete table st. before the create st. but when I am run
You can create a stored procedure owned by SYSDBA or other admin level user with adequate DROP TABLE
and CREATE TABLE
privileges that does the following:
CREATE TABLE <TargetDB>.<TargetTable> AS <SourceDB>.<SourceTable> WITH DATA AND STATS;
You can make it more dynamic by accepting additional parameters on whether the data and/or stats should be copied to the new table.
If you are using BTEQ, you can do something similar (BTEQ command syntax may be a little off but close enough to get the point across):
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;
It seems SAS proc sql cannot do it like T-SQL directly. Anyway, you can write a macro to check if the data set exist. If so, drop it first. Then create the table. Like the following code.
%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)