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 !