121 votes

Comment utiliser une variable pour le nom de la base de données en t-sql ?

J'utilise le nom de la base de données à plusieurs endroits dans mon script et je veux pouvoir le changer rapidement, donc je cherche quelque chose comme ceci :

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO

Mais ça ne marche pas. Alors quelle est la bonne façon d'écrire ce code ?

133voto

John Saunders Points 118808

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)

101voto

Martin Smith Points 174101

Vous pouvez également utiliser sqlcmd pour cela (activez cette option dans le menu "Query" de Management Studio).

:setvar dbname "TEST" 

CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO

10voto

Dillie-O Points 16780

Malheureusement, vous ne pouvez pas déclarer les noms des bases de données avec une variable dans ce format.

Pour ce que vous essayez d'accomplir, vous allez devoir envelopper vos instructions dans une instruction EXEC(). Donc vous aurez quelque chose comme :

SELECT @Sql ='CREATE DATABASE ' + @DBNAME

Ensuite, appelez

EXECUTE(@Sql) or sp_executesql(@Sql)

pour exécuter la chaîne sql.

5voto

Andrew Hare Points 159332

Vous ne pouvez pas utiliser une variable dans une instruction create table. La meilleure chose que je puisse suggérer est d'écrire la requête entière comme une chaîne de caractères et de l'exécuter.

Essayez quelque chose comme ça :

declare @query varchar(max);
set @query = 'create database TEST...';

exec (@query);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X