如何获取 SqlServer 数据库中所有架构的列表

我希望检索给定 SqlServer 数据库中所有架构的列表。使用 ADO.NET模式检索 API,我得到了所有集合的列表,但是没有针对“ Schemas”的集合。 我可以遍历 'Tables''Procedures'集合(如果需要,还可以遍历其他集合)并获得一个惟一模式名的列表,但是难道没有更简单/更短的方法来实现相同的结果吗?

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

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

141477 次浏览

试试这个查询:

SELECT * FROM sys.schemas

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

我真的不知道您所说的查询“模式 API”是什么意思——这些 sys.目录视图(在 sys模式中)是获得关于这些数据库中的数据库和对象的任何系统信息的最佳选择。

还可以查询 INFORATION _ SCHEMA. SCHEMATA 视图:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

我认为建议查询 INFORATION _ SCHEMA 视图,因为它们可以保护您不受底层系统表更改的影响。从 SQLServer2008R2帮助:

信息架构视图提供一个 独立于系统表的内部 SQLServer 元数据的视图。 启用信息架构视图 应用程序正常工作 尽管已经发生了重大变化 制作到基础系统表。 包括信息架构视图 在 SQLServer 中遵守 ISO 标准 标准定义 信息 _ 方案。

具有讽刺意味的是,这句话的前面紧接着写道:

已经对 中断的信息架构视图 向下兼容这些变化 的主题中描述 具体观点。

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

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

对于2000年,这将给出 例子数据库的列表。

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

这就是“向后不兼容”在@漂流的回答中提到的。

在 SQLServer2000(及更低版本)中,并没有真正的“模式”,尽管您可以以类似的方式使用角色作为名称空间。在这种情况下,这可能是最接近的等价物。

SELECT * FROM sysusers WHERE gid <> 0
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';

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

资料库-[你的资料库]-保安-架构

[

还可以使用以下查询获取特定数据库用户的架构:

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