我想检索给定Sql Server数据库中所有模式的列表。使用ADO.NET
模式检索API,我获得了所有集合的列表,但没有“模式”的集合。
我可以遍历'Tables'
,'Procedures'
集合(如果需要,还可以遍历其他集合)并获取唯一模式名称列表,但是没有更简单/更短的方法来实现相同的结果吗?
示例:对于标准'AdventureWorks'
数据库,我也想获得以下列表 - dbo,HumanResources,Person,Production,Purchasing,Sales
(我省略了其他标准方案名称,如db_accessadmin
,db_datareader
等)
编辑:我可以通过查询系统视图来获取模式列表 - INFORMATION_SCHEMA.SCHEMATA
,但更喜欢使用模式API作为首选。
答案 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