Mettre l'intégralité du script dans une chaîne de modèle, avec des espaces réservés {SERVERNAME}. Ensuite, éditez la chaîne en utilisant :
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
puis l'exécuter avec
EXECUTE (@SQL_SCRIPT)
C'est difficile de croire que, pendant trois ans, personne n'a remarqué que mon code ne fonctionne pas !
Vous ne pouvez pas EXEC
plusieurs lots. GO
est un séparateur de lots, et non une instruction T-SQL. Il est nécessaire de construire trois chaînes séparées, puis de EXEC
chacun d'eux après substitution.
Je suppose que l'on pourrait faire quelque chose d'"intelligent" en divisant la chaîne de modèles unique en plusieurs rangées en séparant sur GO
; j'ai fait cela dans le code ADO.NET.
Et d'où vient le mot "SERVERNAME" ?
Voici un code que je viens de tester (et qui fonctionne) :
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)