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

¿Cómo usar una variable para el nombre de la base de datos en T-SQL?

Coloque la secuencia de comandos completa en una cadena de plantilla, con marcadores de posición {NOMBRE DEL SERVIDOR}. Luego edite la cadena usando:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

y luego ejecutarlo con

EXECUTE (@SQL_SCRIPT)

Es difícil creer que, en el transcurso de tres años, nadie se dio cuenta de que mi código no funciona !

No puedes EXEC varios lotes. GO es un separador de lotes, no una instrucción T-SQL. Es necesario construir tres cadenas separadas y luego EXEC cada uno después de la sustitución.

Supongo que uno podría hacer algo "inteligente" dividiendo la cadena de plantilla única en varias filas dividiéndola en GO; Lo he hecho en el código ADO.NET.

¿Y de dónde saqué la palabra "SERVERNAME"?

Aquí hay un código que acabo de probar (y que funciona):

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)