Placez le script entier dans une chaîne de modèle, avec des espaces réservés {SERVERNAME}. Modifiez ensuite la chaîne en utilisant:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
puis exécutez-le avec
EXECUTE (@SQL_SCRIPT)
Difficile de croire qu'en l'espace de 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, pas une instruction T-SQL. Il est nécessaire de créer trois chaînes distinctes, puis EXEC
chacune après la substitution.
Je suppose que l'on pourrait faire quelque chose d '"intelligent" en divisant la chaîne de modèle unique en plusieurs lignes en la divisant GO
; Je l'ai fait 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)