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

Utilizo el nombre de la base de datos en varios lugares en mi script, y quiero poder cambiarlo rápidamente, así que estoy buscando algo como esto:

DECLARE @DBNAME VARCHAR(50) SET @DBNAME = 'TEST' CREATE DATABASE @DBNAME GO ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90 GO ALTER DATABASE @DBNAME SET RECOVERY SIMPLE GO 

Pero no funciona. Entonces, ¿cuál es la forma correcta de escribir este código?

Coloque toda la secuencia de comandos en una cadena de plantilla, con marcadores de posición {SERVERNAME}. 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 múltiples lotes. GO es un separador de lotes, no una statement de T-SQL. Es necesario construir tres cadenas separadas, y luego EXEC cada una después de la sustitución.

Supongo que uno podría hacer algo “inteligente” al dividir la cadena de plantilla simple en varias filas dividiendo en GO ; Lo hice en 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) 

También puede usar el modo sqlcmd para esto (habilítelo en el menú “Consulta” en Management Studio).

 :setvar dbname "TEST" CREATE DATABASE $(dbname) GO ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90 GO ALTER DATABASE $(dbname) SET RECOVERY SIMPLE GO 

EDITAR:

Consulte este artículo de MSDN para establecer los parámetros a través de la herramienta SQLCMD.

Lamentablemente no puede declarar nombres de bases de datos con una variable en ese formato.

Por lo que intenta lograr, necesitará envolver sus declaraciones dentro de una statement EXEC (). Entonces tendrías algo como:

 DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME 

Luego llame

 EXECUTE(@Sql) or sp_executesql(@Sql) 

para ejecutar la cadena sql.

No puede usar una variable en una statement create table. Lo mejor que puedo sugerir es escribir toda la consulta como una cadena y ejecutarla.

Pruebe algo como esto:

 declare @query varchar(max); set @query = 'create database TEST...'; exec (@query);