Inserisci l'intero script in una stringa modello, con segnaposto {SERVERNAME}. Quindi modifica la stringa usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
e poi eseguirlo con
EXECUTE (@SQL_SCRIPT)
È difficile credere che, nel corso di tre anni, nessuno si sia accorto che il mio codice non funziona !
Non puoi EXECpiù batch. GOè un separatore batch, non un'istruzione T-SQL. È necessario costruire tre stringhe separate e poi EXECognuna dopo la sostituzione.
Suppongo che si possa fare qualcosa di "intelligente" spezzando la singola stringa del template in più righe suddividendole GO; L'ho fatto nel codice ADO.NET.
E da dove ho preso la parola "SERVERNAME"?
Ecco del codice che ho appena testato (e che funziona):
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)