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!