Coloque el script completo 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
varios lotes. GO
es un separador de lotes, no una declaración 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 única en varias filas dividiéndola GO
; Lo hice 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)