I want to retrieve a list of all schemas in a given Sql Server database. Using the ADO.NET
schema retrieval API I get a list of all collections but there is no collection for 'Schemas'.
I could traverse the 'Tables'
, 'Procedures'
collections (and others if required) and obtain a list of unique schema names but isn't there a easier/shorter way of achieving the same result?
Example: For the standard 'AdventureWorks'
database I would like too obtain the following list - dbo,HumanResources,Person,Production,Purchasing,Sales
(I've omitted the other standard schem names like db_accessadmin
,db_datareader
etc)
Edit: I can get the list of schemas by querying the system view - INFORMATION_SCHEMA.SCHEMATA
but would prefer using the schema API as first choice.
For 2005 and later, these will both give what you're looking for.
SELECT name FROM sys.schemas
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
For 2000, this will give a list of the databases in the instance.
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
That's the "backward incompatability" noted in @Adrift's answer.
In SQL Server 2000 (and lower), there aren't really "schemas" as such, although you can use roles as namespaces in a similar way. In that case, this may be the closest equivalent.
SELECT * FROM sysusers WHERE gid <> 0