Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment utiliser une variable pour le nom de la base de données dans T-SQL ?

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)

Il est difficile de croire qu'en trois ans, personne n'a remarqué que mon code ne fonctionnait 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 construire trois chaînes distinctes, puis de EXEC chacun après 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 sur GO; Je l'ai fait dans le code ADO.NET.

Et d'où ai-je obtenu 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)