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

alw*_*ing 59 .net c# sql-server ado.net

我想检索给定的Sql Server数据库中的所有模式的列表.使用ADO.NET模式检索API,我得到了所有集合的列表,但没有"模式"的集合.我可以穿越'Tables','Procedures'(如果需要和其他人)的集合,并获得独特的架构名称列表,但不存在实现相同结果的更简单/短呢?

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

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

har*_*rpo 70

对于2005年及以后,这些都将提供您正在寻找的东西.

SELECT name FROM sys.schemas
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
Run Code Online (Sandbox Code Playgroud)

2000年,这会给列表数据库的实例.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
Run Code Online (Sandbox Code Playgroud)

这就是@Adrift的回答中提到的"落后的不兼容性".

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

SELECT * FROM sysusers WHERE gid <> 0
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 13

在此处尝试此查询:

SELECT * FROM sys.schemas
Run Code Online (Sandbox Code Playgroud)

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

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

  • "系统".目录视图可能更有效,更快,但它们是特定于SQL Server的.INFORMATION_SCHEMA视图是一个与数据库无关的ANSI标准,用于查询数据库元数据,但由于它们是由标准委员会设计的......你得到的想法..... (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';
Run Code Online (Sandbox Code Playgroud)


Jef*_*ata 5

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

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
Run Code Online (Sandbox Code Playgroud)

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

信息架构视图提供SQL Server元数据的内部系统表独立视图.尽管已对基础系统表进行了重大更改,但信息模式视图使应用程序能够正常工作.SQL Server中包含的信息架构视图符合INFORMATION_SCHEMA的ISO标准定义.

具有讽刺意味的是,紧接着是这个说明:

对破坏向后兼容性的信息模式视图进行了一些更改.这些更改在特定视图的主题中进行了描述.

  • +1指出讽刺,给了我一个好笑. (2认同)