Lägg hela skriptet i en mallsträng med platshållare för {SERVERNAME}. Redigera sedan strängen med:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
och kör det sedan med
EXECUTE (@SQL_SCRIPT)
Det är svårt att tro att ingen under loppet av tre år märkte att min kod inte fungerar !
Du kan inte EXEC
flera partier. GO
är en batchseparator, inte en T-SQL-sats. Det är nödvändigt att bygga tre separata strängar och sedan till EXEC
var och en efter byte.
Jag antar att man skulle kunna göra något "smart" genom att dela upp den enda mallsträngen i flera rader genom att dela på GO
; Jag har gjort det i ADO.NET-kod.
Och var fick jag ordet "SERVERNAMN" ifrån?
Här är lite kod som jag just testade (och som fungerar):
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)