如何获取Sql Server数据库中所有模式的列表

时间:2010-09-15 16:14:48

标签: c# .net sql-server ado.net

我想检索给定Sql Server数据库中所有模式的列表。使用ADO.NET模式检索API,我获得了所有集合的列表,但没有“模式”的集合。 我可以遍历'Tables''Procedures'集合(如果需要,还可以遍历其他集合)并获取唯一模式名称列表,但是没有更简单/更短的方法来实现相同的结果吗?

示例:对于标准'AdventureWorks'数据库,我也想获得以下列表 - dbo,HumanResources,Person,Production,Purchasing,Sales(我省略了其他标准方案名称,如db_accessadmindb_datareader等)

编辑:我可以通过查询系统视图来获取模式列表 - INFORMATION_SCHEMA.SCHEMATA,但更喜欢使用模式API作为首选。

6 个答案:

答案 0 :(得分:67)

对于2005年及以后,这些都会提供你想要的东西。

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

对于2000,这将在实例中提供数据库的列表。

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

这是@Adrift回答中提到的“落后的不可比性”。

在SQL Server 2000(及更低版本)中,虽然您可以以类似的方式将角色用作命名空间,但实际上并没有“模式”。在这种情况下,这可能是最接近的等价物。

SELECT * FROM sysusers WHERE gid <> 0

答案 1 :(得分:12)

在此处尝试此查询:

SELECT * FROM sys.schemas

这将为您执行此操作的数据库中的所有定义模式提供名称和schema_id。

通过查询“架构API”我真的不知道你的意思 - 这些sys.目录视图(在sys架构中)是关于数据库和对象的任何系统信息的最佳选择在那些数据库中。

答案 2 :(得分:6)

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';

答案 3 :(得分:5)

您还可以查询INFORMATION_SCHEMA.SCHEMATA视图:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

我认为建议查询INFORMATION_SCHEMA视图,因为它们可以保护您免受对底层sys表的更改。从SQL Server 2008 R2帮助:

  

信息架构视图提供了一个   内部,系统表独立   SQL Server元数据的视图。   信息模式视图启用   应用程序正常工作   虽然已经发生了重大变化   制作到底层系统表。   包含信息架构视图   在SQL Server中符合ISO   标准定义   INFORMATION_SCHEMA。

具有讽刺意味的是,紧接着是这个注释:

  

已对此进行了一些更改   信息架构视图中断   向后兼容性。这些变化   在主题中描述   具体意见。

答案 4 :(得分:0)

如果您使用的是Sql Server Management Studio,则可以通过浏览到以下内容获取所有架构的列表,创建自己的架构或删除现有架构:

数据库 - [您的数据库] - 安全 - 架构

答案 5 :(得分:0)

您还可以使用以下查询来获取特定数据库用户的模式:

select s.schema_id, s.name as schema_name
from sys.schemas s
inner join sys.sysusers u on u.uid = s.principal_id
where u.name='DataBaseUserUserName'
order by s.name