Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So überprüfen Sie, ob die Tabelle vorhanden ist, und benennen Sie sie dann um

Sie haben mehr Möglichkeiten, eine besteht darin, das Ganze mit dynamischen Abfragen zu erledigen. Sie können sich auch SQLCMD ansehen. Ich zeige Ihnen ein kurzes Modell der dynamischen SQL-Lösung.

DECLARE @TableSchema sys.sysname = N'dbo';
DECLARE @TableName sys.sysname = N'x';
DECLARE @BackupTable sys.sysname = @TableName + '_' + CONVERT(VARCHAR(32), GETDATE(), 112);


DECLARE @SQL NVARCHAR(MAX) = N'

DECLARE @TableWithSchema NVARCHAR(256) = QUOTENAME(@TableSchema) + ''.'' + QUOTENAME(@TableName);

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_SCHEMA = @TableSchema
             AND  TABLE_NAME = @TableName))
BEGIN
  EXEC sp_rename @TableWithSchema, @BackupTable, ''OBJECT''
END

CREATE TABLE ' + QUOTENAME(@TableSchema) + '.' + QUOTENAME(@TableName) + '(
/* Column definitions here*/
);
';

EXEC sp_executesql
    @stmt = @SQL
  , @params = N'@TableSchema sys.sysname, @TableName sys.sysname, @BackupTable sys.sysname'
  , @TableSchema = @TableSchema
  , @TableName = @TableName
  , @BackupTable = @BackupTable
;

/* Do BCP here */

Bitte beachten Sie, dass das 112-Datumsformat (siehe Konvertieren) keinen Zeitwert enthält, daher möchten Sie es ändern, damit das Skript mehrmals am Tag ausgeführt werden kann. Sie können zum Beispiel mit select REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(32), GETDATE(), 120), ' ', ''), ':', ''), '-', '') (jjjjMMttHHmmss) statt

Seien Sie wie immer vorsichtig und überprüfen Sie Ihren Code, wenn Sie mit dynamischen Abfragen arbeiten!