2010-09-15 16 views
49

Deseo recuperar una lista de todos los esquemas en una base de datos de servidor Sql determinada. Utilizando la API de recuperación de esquemas ADO.NET obtengo una lista de todas las colecciones, pero no hay ninguna colección para 'Esquemas'. Podría atravesar las colecciones 'Tables', 'Procedures' (y otras si es necesario) y obtener una lista de nombres de esquema únicos, pero ¿no hay una forma más fácil/más corta de lograr el mismo resultado?¿Cómo obtengo una lista de todos los esquemas en una base de datos del servidor Sql?

Ejemplo: Para la base de datos estándar 'AdventureWorks' Me gustaría también obtener la siguiente lista - dbo,HumanResources,Person,Production,Purchasing,Sales (he omitido los nombres de otros Schem estándar como db_accessadmin, db_datareader etc)

Editar: Puedo obtener la lista de esquemas al consultar la vista del sistema: INFORMATION_SCHEMA.SCHEMATA, pero preferiría utilizar la API de esquema como primera opción.

Respuesta

54

Para 2005 y versiones posteriores, ambos le darán lo que está buscando.

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

Para el año 2000, esto le dará una lista de las bases de datos en el ejemplo .

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA 

Esa es la "incompatibilidad hacia atrás" notada en la respuesta de @ Adrift.

En SQL Server 2000 (y versiones anteriores), no hay realmente "esquemas" como tal, aunque puede usar roles como espacios de nombres de manera similar. En ese caso, este puede ser el equivalente más cercano.

SELECT * FROM sysusers WHERE gid <> 0 
+0

Intenté usar esto en un servidor SQL 2000, pero no obtuve todos los esquemas devueltos. Alguien sabe por qué pasa esto? – evilfish

+0

No tengo una instancia de 2000 para probar, ¡y pensé que * I * era una verdadera percha! Recuerde que 2000 no tiene "esquemas" reales como las versiones posteriores, por lo que lo que realmente está enumerando son los roles. Pruebe con 'SELECT * FROM sysusers' y vea si ve los identificadores que está buscando. – harpo

+0

Lo leí y SELECCIONAR * FROM INFORMATION_SCHEMA.SCHEMATA en realidad no es una buena idea para usar en cuanto dicen las fuentes que leí. Un método mucho mejor es ejecutar el procedimiento almacenado de la tabla maestra "sp_databases". Funciona tanto para 2000 como para 2005 (probado ambos), y en mi caso devolvió el resultado correcto cada vez. – evilfish

8

Intentar esta consulta aquí:

SELECT * FROM sys.schemas 

esto le dará el nombre y schema_id define para todos los esquemas de la base de datos se ejecuta este en

Realmente no sé qué quiere decir con. consultar la "API de esquema": estas vistas de catálogo sys. (en el esquema sys) son su mejor opción para cualquier información de sistema sobre bases de datos y objetos en esas bases de datos.

+0

genial. Su consulta parece hacer el truco también. ¿Qué es más eficiente: consultar sys.schema o INFORMATION_SCHEMA.SCHEMATA? Por 'API de Schema' me refiero a las llamadas estándar SqlConnection.GetSchema 'en lugar de emitir una consulta explícitamente. – alwayslearning

+2

El "sys" las vistas de catálogo son probablemente un poco más eficientes y rápidas, pero son específicas de SQL Server. Las vistas de INFORMATION_SCHEMA son un estándar ANSI independiente de la base de datos para consultar los metadatos de la base de datos, pero como fueron diseñados por un comité de estándares ... usted obtiene la idea ..... –

+0

puede no estar relacionado, intenté [esto] (http://stackoverflow.com/a/175450/2218697) con múltiples declaraciones de selección para 'PK, FK, D, C, V, UQ', etc. para comparar la base de datos de origen y de destino, pero luego encontré [esto] (http: //stackoverflow.com/a/685073/2218697) en VS, pero ¿no existe una 'sql query' para comparar la base de datos de origen y destino completa? – stom

4

También puede consultar la vista INFORMATION_SCHEMA.SCHEMATA: Se recomienda

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

Creo que la consulta de las vistas INFORMATION_SCHEMA ya que le protegen de cambios en las tablas subyacentes sys. Del R2 Ayuda de SQL Server 2008: vistas de esquema

de información proporcionan una vista interna, sistema de mesas-independiente de los metadatos de SQL Server. Las vistas del esquema de información habilitan las aplicaciones para que funcionen correctamente aunque se han realizado cambios significativos en en las tablas del sistema subyacentes. Las vistas del esquema de información incluidas en SQL Server cumplen con la definición estándar ISO para INFORMATION_SCHEMA.

Irónicamente, esto es precedido inmediatamente por esta nota:

Algunos cambios se han hecho a las vistas de esquema información que rompen compatibilidad con versiones anteriores. Estos cambios se describen en los temas para las vistas específicas .

+1

+1 por señalar la ironía, me dio una buena risa. – 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 está utilizando SQL Server Management Studio, se puede obtener una lista de todos los esquemas, crear su propio esquema o eliminar una existente accediendo a:

Bases de datos - [su base de datos ] - Seguridad - Esquemas

Cuestiones relacionadas