Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come verificare che la tabella esista e quindi rinominarla

Hai più opzioni, una è fare tutto usando le query dinamiche. Puoi anche dare un'occhiata a SQLCMD. Ti mostrerò una rapida simulazione della soluzione SQL dinamica.

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 */

Si noti che il formato della data 112 (vedi convertire) non contiene il valore dell'ora, quindi si desidera modificarlo per consentire l'esecuzione dello script più volte al giorno. Puoi andare ad esempio con select REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(32), GETDATE(), 120), ' ', ''), ':', ''), '-', '') (aaaaMMggHHmmss) invece

Come sempre, fai attenzione e ricontrolla il tuo codice quando lavori con query dinamiche!