Sæt hele scriptet i en skabelonstreng med {SERVERNAME} pladsholdere. Rediger derefter strengen med:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
og kør det derefter med
EXECUTE (@SQL_SCRIPT)
Det er svært at tro, at ingen i løbet af tre år har bemærket, at min kode ikke virker !
Du kan ikke EXEC
flere partier. GO
er en batch-separator, ikke en T-SQL-sætning. Det er nødvendigt at bygge tre separate strenge og derefter til EXEC
hver enkelt efter udskiftning.
Jeg formoder, at man kunne gøre noget "klogt" ved at bryde den enkelte skabelonstreng i flere rækker ved at opdele på GO
; Jeg har gjort det i ADO.NET-kode.
Og hvor har jeg fået ordet "SERVERNAVN" fra?
Her er noget kode, som jeg lige har testet (og som virker):
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)