我想从mssql服务器实例获取所有用户数据库的列表.最好的方法是什么?
我知道我可以从sys.databases中进行选择,但除了硬编码要排除的名称列表之外,我没有看到任何方法来过滤掉系统数据库.
我需要脚本在2000/2005和2008上工作.
如果我上面列出的方法是唯一的方法,那么我应该排除哪些名称?我不知道2005年或2008年是否添加了任何新的系统数据库.
今天再次关注这一点,并决定剖析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)执行的.
第一个查询将返回一个表,其中包含有关实例上所有数据库的数据:
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中运行.
在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')