Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment vérifier l'existence d'une table, puis la renommer

Vous avez plus d'options, l'une consiste à tout faire en utilisant des requêtes dynamiques. Vous pouvez également jeter un œil à SQLCMD. Je vais vous montrer une maquette rapide de la solution SQL dynamique.

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

Veuillez noter que le format de date 112 (voir convertir) ne contient pas de valeur temporelle, vous souhaitez donc le modifier afin de permettre au script de s'exécuter plusieurs fois par jour. Vous pouvez aller par exemple avec select REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(32), GETDATE(), 120), ' ', ''), ':', ''), '-', '') (aaaaMMjjHHmmss) à la place

Comme toujours, soyez prudent et revérifiez votre code lorsque vous travaillez avec des requêtes dynamiques !