Coloque o script inteiro em uma string de modelo, com espaços reservados {SERVERNAME}. Em seguida, edite a string usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
e depois execute-o com
EXECUTE (@SQL_SCRIPT)
É difícil acreditar que, ao longo 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 lote, não uma instrução T-SQL. É necessário construir três strings separadas e depois EXEC
cada um após a substituição. Suponho que alguém poderia fazer algo "inteligente" quebrando a única string de modelo em várias linhas, dividindo em
GO
; Eu fiz isso no código ADO.NET. E de onde eu tirei a palavra "SERVERNAME"?
Aqui está um código que 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)