Coloque toda la secuencia de comandos en una cadena de plantilla, con marcadores de posición {SERVERNAME}. A continuación, edite la cadena usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
y luego ejecutarlo con
EXECUTE (@SQL_SCRIPT)
Es difícil de creer que, en el transcurso de tres años, nadie se dio cuenta de que mi código no lo hace trabajo!
No puede EXEC
varios lotes. GO
es un separador de lotes, no una declaración de T-SQL. Es necesario construir tres cadenas separadas, y luego a EXEC
cada una después de la sustitución.
Supongo que se 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 prueba (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)
SQL dinámico ..... –