Zet het hele script in een sjabloontekenreeks, met tijdelijke aanduidingen voor {SERVERNAME}. Bewerk vervolgens de string met:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
en voer het dan uit met
EXECUTE (@SQL_SCRIPT)
Het is moeilijk te geloven dat in de loop van drie jaar niemand heeft opgemerkt dat mijn code niet werkt !
U kunt niet EXEC
meerdere batches. GO
is een batchscheidingsteken, geen T-SQL-instructie. Het is nodig om drie afzonderlijke strings te bouwen, en dan naar EXEC
elk na vervanging.
Ik veronderstel dat je iets "slims" zou kunnen doen door de enkele sjabloonreeks in meerdere rijen te splitsen door te splitsen op GO
; Ik heb dat gedaan in ADO.NET-code.
En waar heb ik het woord "SERVERNAME" vandaan?
Hier is wat code die ik zojuist heb getest (en die werkt):
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)