当前位置:  开发笔记 > 数据库 > 正文

如何通过t-sql获取所有用户数据库的列表?

如何解决《如何通过t-sql获取所有用户数据库的列表?》经验,为你挑选了3个好方法。

我想从mssql服务器实例获取所有用户数据库的列表.最好的方法是什么?

我知道我可以从sys.databases中进行选择,但除了硬编码要排除的名称列表之外,我没有看到任何方法来过滤掉系统数据库.

我需要脚本在2000/2005和2008上工作.

如果我上面列出的方法是唯一的方法,那么我应该排除哪些名称?我不知道2005年或2008年是否添加了任何新的系统数据库.



1> gvee..:

今天再次关注这一点,并决定剖析Management Studio正在做什么来填充对象资源管理器的详细信息.

对象资源管理器>系统数据库

事实证明,微软实施的解决方案非常简单,归结为以下几点:

SELECT *
FROM   master.sys.databases
WHERE  Cast(CASE WHEN name IN ('master', 'model', 'msdb', 'tempdb') THEN 1 ELSE is_distributor END As bit) = 0

请注意,这是使用SSMS 2008R2(10.50.4033.0)执行的.



2> Maestro..:

第一个查询将返回一个表,其中包含有关实例上所有数据库的数据:

Select * 
From sys.databases

从该表中您可以看到,您可以使用该WHERE子句缩小您要查找的数据范围.例如,以下查询将返回相同的结果表(您最有可能寻找的结果表):

Select * 
From sys.databases 
Where database_id > 5


Select * 
From sys.databases 
Where len(owner_sid)>1

这些查询将在SQL Server 2008和2012中运行.


关于像这样使用database_id的警告.在我的没有报告服务的SQL Express实例上,database_id = 5是一个用户数据库,因此使用> 5将无法获取它.在另一个具有报告服务的实例上,id 5 = ReportServer $ SQL1TempDB.如果安装了报告服务,还使用len(owner_sid)> 1将获取ReportServer $ SQL1和ReportServer $ SQL1TempDB.最后请注意,如果您尚未设置用户数据库的所有者(例如,可能从一个服务器恢复到另一个服务器),则它将拥有owner_sid = 0x01,因此len(owner_sid)> 1将不会获取它.

3> 小智..:

在SQL Server 2008 R2 Express上,看起来我无法可靠地使用上述任何方法。INFORMATION_SCHEMA.SCHEMATA仅向我显示当前数据库中的信息,db_id(database_id)#5是我的第一个用户数据库,而在一个镜像数据库(在SQL Server 2008 R2 Standard上运行)上的两个用户数据库上的owner_sid显示owner_sid =我的两个最近创建的数据库为1。(PablolnNZ在上面的评论是正确的:我没有为这两个数据库设置显式所有者,因此它仍然显示为拥有“ sa”的所有者。)

我能够使用的唯一可靠方法是:

SELECT name FROM sys.databases
WHERE name NOT IN ('master', 'model', 'tempdb', 'msdb', 'Resource')

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有