sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo comprobar que la tabla existe y luego cambiarle el nombre

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.