Placez le script entier dans une chaîne de modèle, avec des espaces réservés {SERVERNAME}. Ensuite, modifier la chaîne en utilisant:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
puis l'exécuter avec
EXECUTE (@SQL_SCRIPT)
Il est difficile de croire que, au cours de trois ans, personne n'a remarqué que mon code ne travail! Vous ne pouvez pas EXEC
plusieurs lots. GO
est un séparateur de lots, pas une instruction T-SQL. Il est nécessaire de construire trois chaînes séparées, puis de EXEC
chacune après substitution.
Je suppose que l'on pourrait faire quelque chose de "malin" en cassant la chaîne de template unique en plusieurs lignes en divisant GO
; J'ai fait cela dans le code ADO.NET.
Et d'où vient le mot "SERVERNAME"?
est ici 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)
Dynamic SQL ..... –