2010-09-15 7 views
49

Je souhaite récupérer une liste de tous les schémas d'une base de données Sql Server donnée. En utilisant l'API de récupération de schéma ADO.NET, j'obtiens une liste de toutes les collections mais il n'y a pas de collection pour 'Schémas'. Je pourrais traverser les collections 'Tables', 'Procedures' (et autres si nécessaire) et obtenir une liste de noms de schémas uniques mais n'y a-t-il pas un moyen plus facile/plus court d'atteindre le même résultat?Comment obtenir une liste de tous les schémas d'une base de données Sql Server

Exemple: Pour la base de données standard 'AdventureWorks' Je voudrais aussi obtenir la liste suivante - dbo,HumanResources,Person,Production,Purchasing,Sales (je l'ai omis les autres noms standard SCHEM comme db_accessadmin, db_datareader etc)

Edit: Je peux obtenir la liste des schémas en interrogeant la vue système - INFORMATION_SCHEMA.SCHEMATA mais préférerait utiliser l'API du schéma en premier choix.

Répondre

54

Pour 2005 et plus tard, ceux-ci donneront tous deux ce que vous cherchez.

SELECT name FROM sys.schemas 
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

Pour 2000, cela donnera une liste des bases de données dans le exemple.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA 

C'est la "incompatibilité arrière" mentionnée dans la réponse de @ Adrift.

Dans SQL Server 2000 (et versions antérieures), il n'y a pas vraiment de "schémas" en tant que tels, bien que vous puissiez utiliser les rôles comme espaces de noms d'une manière similaire. Dans ce cas, cela peut être l'équivalent le plus proche.

SELECT * FROM sysusers WHERE gid <> 0 
+0

J'ai essayé d'utiliser ceci sur un serveur sql 2000, mais je n'ai pas récupéré tous les schémas. Quelqu'un sait pourquoi cela arrive? – evilfish

+0

Je n'ai pas une instance de 2000 pour tester - et je pensais que * I * était un vrai accrochage! Rappelez-vous que 2000 n'a pas de "schémas" réels comme les versions ultérieures, donc ce que vous êtes vraiment en train de répertorier, ce sont les rôles. Essayez simplement 'SELECT * FROM sysusers' et voyez si vous voyez les identifiants que vous recherchez. – harpo

+0

Je l'ai lu et SELECT * FROM INFORMATION_SCHEMA.SCHEMATA n'est pas une bonne idée d'utiliser aussi loin que les sources que j'ai lues. Une méthode bien meilleure consiste à exécuter la procédure stockée de la table principale "sp_databases". Il fonctionne pour 2000 et 2005 (testé à la fois), et dans mon cas retourné le résultat correct à chaque fois. – evilfish

8

Essayez cette requête ici:

SELECT * FROM sys.schemas 

Cela vous donnera le nom et schema_id pour tous les schémas définit dans la base de données vous exécutez ce dans

Je ne sais pas vraiment ce que vous entendez par. interroger l'API du schéma - ces vues de catalogue sys. (dans le schéma sys) sont votre meilleur choix pour toute information système sur les bases de données et les objets dans ces bases de données.

+0

cool. Votre requête semble aussi faire l'affaire. Merveilleux quoi de plus efficace - interroger sys.schema ou vue INFORMATION_SCHEMA.SCHEMATA? Par "API de schéma", j'entends les appels SqlConnection.GetSchema standard plutôt que d'émettre explicitement une requête. – alwayslearning

+2

Le "système" Les vues de catalogue sont probablement un peu plus efficaces et plus rapides, mais elles sont spécifiques à SQL Server. Les vues INFORMATION_SCHEMA sont une norme ANSI indépendante de la base de données pour interroger les métadonnées de base de données, mais comme elles ont été conçues par un comité de normalisation ...... vous avez l'idée ..... –

+0

peut-être pas lié, j'ai essayé [ceci] (http://stackoverflow.com/a/175450/2218697) avec plusieurs instructions select pour PK, FK, D, C, V, UQ etc pour comparer la source et la base de données cible, mais alors j'ai trouvé [this] (http: //stackoverflow.com/a/685073/2218697) dans VS, mais n'y a-t-il pas une "requête sql" pour comparer la base de données source et cible complète? – stom

4

Vous pouvez également interroger la vue INFORMATION_SCHEMA.SCHEMATA:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

Je crois que les vues de l'interrogation INFORMATION_SCHEMA est recommandé car ils vous protègent des changements aux tables sys sous-jacents. A partir de SQL Server 2008 R2 Help:

vues du schéma d'information fournissent une interne, vue système indépendant table des métadonnées SQL Server. Les vues de schéma d'informations permettent aux applications de fonctionner correctement bien que des modifications significatives aient été apportées aux tables système sous-jacentes . Les vues de schéma d'informations incluses dans SQL Server sont conformes à la définition standard ISO pour le champ INFORMATION_SCHEMA .

Ironie du sort, cela est immédiatement précédé par cette note:

Quelques modifications ont été apportées aux vues du schéma d'information qui rompent rétrocompatibilité. Ces modifications sont décrites dans les rubriques des vues spécifiques .

+1

+1 pour souligner l'ironie, m'a donné un bon rire. – codenheim

4
select s.name + '.' + ao.name,s.name from sys.all_objects ao 
inner join sys.schemas s 
on s.schema_id = ao.schema_id 
where ao.type='u' 
0

Si vous utilisez SQL Server Management Studio, vous pouvez obtenir une liste de tous les schémas, créez votre propre schéma ou supprimer un existant en naviguant à:

Bases de données - [Votre base de données ] - Sécurité - Schémas

Questions connexes