Tiene más opciones, una es hacer todo usando consultas dinámicas. También puede echar un vistazo a SQLCMD. Le mostraré una maqueta rápida de la solución de SQL dinámico.
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 */
Tenga en cuenta que el formato de fecha 112 (ver convertir) no contiene el valor de la hora, por lo que desea cambiarlo para permitir que el script se ejecute varias veces al día. Puede ir, por ejemplo, con select REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(32), GETDATE(), 120), ' ', ''), ':', ''), '-', '')
(aaaaMMddHHmmss) en su lugar
Como siempre, tenga cuidado y verifique dos veces su código cuando trabaje con consultas dinámicas.