6
votes

Utiliser dB qui peut ne pas exister

J'ai un script qui possède une instruction code> de base de données code>. Le script fonctionne parfaitement bien si la base de données existe. Si cela n'existe pas, il échoue avec le message "La base de données n'existe pas", ce qui permet un sens parfait.

Maintenant, je ne l'échoue pas, alors j'ai ajouté un chèque pour sélectionner si le DB existe sur sys.databases (que je représenterai ici avec un si 1 = 2 code> Vérifiez le sakant de simplicité), donc, si le DB existe (1 = 1), puis exécutez l'instruction "Utilisez". P>

à ma surprise, le script a continué à défaut. J'ai donc essayé d'ajouter un bloc d'attraction. Même résultat. Il semble que la déclaration d'utilisation soit évaluée avant toute autre chose, quelle id gênante parce que maintenant mon script peut casser. P>

Donc, ma question est la suivante: comment puis-je avoir une instruction code> utiliser code> sur un script à une base de données qui peut ne pas exister? p>

BEGIN TRY
   IF (1=1) BEGIN --if DB exists
    USE DB_THAT_MAY_NOT_EXIST
   END 
END TRY
BEGIN CATCH
END CATCH


2 commentaires

Quelle est la taille de ce script @diego? Il pourrait être plus facile de qualifier complètement vos noms de table et d'envelopper l'ensemble du script dans un s'il existe ... mais cela dépend entièrement de ce que vous voulez faire si la base de données ne existe.


En outre, peut-être Cette question est une duplication potentielle.


3 Réponses :


3
votes

à quoi ça se passe? Peut-être que vous pouvez vérifier de cette façon. xxx pré>

ou essayez ceci: p> xxx pré>

donc pour table: p>

sp_msforeachdb ‘select * from ?.sys.tables’


1 commentaires

J'ai fini par utiliser votre idée si (db_id ('$ (dbname)') n'est pas null) commence (son script VSQL). Merci!



1
votes

En haut de la tête, vous pouvez qualifier pleinement toutes vos références pour éviter la déclaration . J'espère que quelqu'un propose une solution qui nécessite moins de PT.

Après avoir vérifié si le DB existe, au lieu de xxx

< Pré> xxx


1 commentaires

Beaucoup de déclarations n'acceptent pas 3 noms de pièces. Comme la procédure de création



5
votes

Je ne crois pas que vous puissiez faire ce que vous voulez faire. Documentation Spécifie que Utiliser est exécuté à compiler heure et heure d'exécution.

En tant que tel, Utiliser sur une base de données qui n'existe pas va créer une heure de compilation Erreur. Je ne suis pas au courant d'un moyen de contourner les erreurs de temps compilés.

Comme une autre réponse suggère, utilisez le qualificatif de base de données dans tous vos noms.

Vous pouvez également vérifier si une base de données existe, sans passer à elle. Voici un moyen: xxx


1 commentaires

C'est en fait une bonne idée, mais le problème est que, quelle que soit la base de données existante ou non, j'ai toujours besoin de "utiliser" cela afin que le script échouera toujours