Coloque o script inteiro em uma sequência de modelos, com espaços reservados {SERVERNAME}. Em seguida, edite a string usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
e execute-o com
EXECUTE (@SQL_SCRIPT)
É difícil acreditar que, no decorrer de três anos, ninguém percebeu que meu código não funciona !
Você não pode EXEC
vários lotes. GO
é um separador de lotes, não uma instrução T-SQL. É necessário construir três strings separadas e depois para EXEC
cada uma após a substituição.
Suponho que alguém possa fazer algo "inteligente" quebrando a cadeia de modelo único em várias linhas dividindo GO
; Eu fiz isso no código ADO.NET.
E de onde eu recebi a palavra "SERVERNAME"?
Aqui está um código que eu acabei de testar (e 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)