9
votes

SQL Server: modifier la base de données actuelle via une variable

J'utilise SQL Server 2008 et j'essaie de modifier le nom de la base de données actuel en une variable. Je fais normalement cela explicitement avec la déclaration utilise myDatabasename . La question se pose parce que si je suis en cours d'exécution d'un script et si je ne modifie pas le nom de la base de données, il crée toutes les tables de la base de données [maître] .

J'ai essayé ce qui suit mais pas semble fonctionner car il continue à appliquer le reste des codes Créer des tables sur [maître] . xxx


2 commentaires

Comment exécutez-vous le script?


En tant que nouvelle requête au niveau du serveur.


3 Réponses :


14
votes

Exécution Utiliser quelque_db code> dans Dynamic SQL fonctionne, mais malheureusement, lorsque le contexte de la base de données est modifié à l'origine de ce qu'il était à l'origine.

Vous pouvez utiliser sqlcmd code> mode pour cela (actionnez-le sur la" requête " "Menu dans le studio de gestion). P>

:setvar dbname "MyNewDatabaseName" 

IF DB_ID('$(dbname)') IS NULL
    BEGIN

    DECLARE @SqlQuery NVARCHAR(1000);
    SET @SqlQuery = N'CREATE DATABASE ' + QUOTENAME('$(dbname)') + ' 
            COLLATE SQL_Latin1_General_CP1_CI_AS'
    EXEC(@SqlQuery) 

    END

GO

USE $(dbname)

GO


6 commentaires

+1 - C'est exactement (ou bien, très proche) à ce que je répondais. Mais vous êtes vraiment rapide :-)


Est-il possible de passer du mode sqlcmd en mode SQL dynamique dans la même requête?


@Rick - ayant sqlcmd activé ne vous empêche pas d'utiliser des constructions SQL. Les outils client effectuent la substitution variable avant que la commande soit soumise à SQL Server.


@Rick, si vous êtes heureux avec Dynamic SQL, pourquoi pas seulement faire Set @sql = 'utiliser' + @dbname + '; ... Autre sql dynamique ...; '; ?


Je serais plus strict avec UTILISATION (DBNAME) - Il substitue une variable directement sous forme de texte lorsqu'il est exécuté avec Real SQLCMD, sera donc via une erreur. Correctement Compatible avec SQLCMD MODE et SQLCMD.EXE est: Utilisez [$ (dbname)]


Aussi +1 pour si db_id () :)



0
votes

Ceci peut être fait au moyen de SQL dynamique. Utilisez une variable pour stocker dbname et utilisez cette variable pour créer une chaîne SQL comme xxx

puis utilisez exécuté () ou sp_executeql pour exécuter la chaîne SQL.


1 commentaires

..La la base de données de modifications ne semble s'appliquer qu'à l'instruction SQL à l'intérieur du paramètre "CODE> EXEC / SP_EXECUTSQL Fonctions, pas toutes les instructions SQL suivantes



3
votes

Juste pour ajouter la réponse de Martin Smith,

Si tel est ainsi, vous pouvez déployer votre création de table ou votre modification de table à plusieurs bases de données, vous pouvez séparer vos scripts de création de la base de données et d'objet, puis de les exécuter en séquence à l'aide d'un fichier BAT Utilisation du fichier d'entrée -I code>. Cela vous permet de modifier des bases de données entre les scripts de Master vers la nouvelle base de données. P>

Alors votre fichier de commandes peut P>

 sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
 sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 


0 commentaires