SQL create database si n'existe pas, les comportements inattendus
J'ai une longue procédure stockée qui commence avec la déclaration suivante:
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME')
BEGIN
CREATE DATABASE [DBNAME]
END;
Il est prévu de créer la DB sur mon serveur local, si elle n'existe pas. Le problème, c'est que presque toutes les fois qu'elle passe par cette partie de la procédure stockée et ne pas le créer, ce qui interfère alors avec l'autre code à partir de la même procédure. D'autre part, dans de très rares cas, il crée la DB. Ma question est: Est-il une meilleure façon de vérifier si le DB existe, parce que j'ai déjà essayé au moins 10.
D'autres moyens, j'ai essayé:
IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = N'DBNAME')
BEGIN
CREATE DATABASE [DBNAME]
END;
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'DBNAME')
BEGIN
CREATE DATABASE [DBNAME]
END;
IF NOT EXISTS (SELECT name FROM master.dbo.sys.databases WHERE name = N'DBNAME')
BEGIN
CREATE DATABASE [DBNAME]
END;
Mais si je le lance en dehors de ma sp, il fonctionne parfaitement, ce qui me fait penser qu'il peut y avoir certains problèmes liés à des autorisations.
avez-vous utilisé un roll back dans le cadre de l'ur proc ..si oui, alors vérifier qu'il n'est pas annulée..
Non, je seulement obtenir la Base de données 'DBNAME' n'existe pas, quand j'essaye de l'utiliser dans la procédure stockée par la suite. Je ne suis pas à l'aide d'une transaction.
Si vous utilisez
Transaction
, assurez-vous que vous commit
.Documentation MSDN devrait vous aider!
OriginalL'auteur StefanL19 | 2016-11-28
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
Si ne fonctionne pas, il pourrait être les autorisations. qui pourrait expliquer pourquoi vous n'êtes pas un message d'erreur.
"...les autorisations minimales requises pour voir la ligne correspondante sont MODIFIER une BASE de données ou de VISIONNER la BASE de données au niveau du serveur d'autorisation, ou de CRÉER autorisation de BASE de données dans la base de données master. La base de données à laquelle l'appelant est connecté peut toujours être considérée dans sys.les bases de données" (à partir de https://msdn.microsoft.com/en-us/library/ms178534.aspx).
Ce que les autorisations de l'utilisateur sous lequel vous êtes en cours d'exécution a?
Essayez de changer votre code de simplement retourner le contenu de sys.les bases de données de sorte que vous pouvez voir.
modifié la réponse d'ajouter des commentaires sur les autorisations. Essayer
OriginalL'auteur under
Carillon parce que j'ai eu un problème similaire: j'ai voulu créer une base de données si elle n'existe pas, alors effectuer des opérations sur la base de données.
Je pense que le problème est que le script essayé de l'exécuter en un seul lot, de sorte qu'il a essayé de
USE
la base de données SQL serveur a reçu leCREATE
de commande.Cela a abouti à l'ensemble du script arriver est revenue et il semblait que la racine du problème est que la base de données ne l'ai jamais créé.
Dans mon cas, la solution était de ajouter un
commande après la première partie du script où la table est créée, mais avant que je commence à travailler avec elle (par exemple, la création de tables).
OriginalL'auteur martonbognar
Lorsque l'on compare les chaînes de caractères à utiliser COMME
OriginalL'auteur user1054844