SQL Server sys.databases vs sysdatabases?

时间:2015-12-03 15:56:49

标签: sql-server

我有一个查询,我用它来列出数据库:

SELECT * FROM sys.databases

但是这个查询在SQL Server 2000中不起作用。

以下查询在SQL Server 2000及更高版本中均有效:

SELECT NAME FROM sysdatabases;

我发现this articlesys.database上有一些注释(并且还指出由于兼容性原因而保留了sysdatabases)。

我想知道的是,如果有任何原因我不应该使用sysdatabases来获取数据库名称列表?除了使用sys.databases是更新的风格之外,我还没有看到任何其他地方。

2 个答案:

答案 0 :(得分:6)

我可以想到以下原因:

  • 可能是removed in future versions(强调我的):

      

    此SQL Server 2000系统表作为向后兼容性的视图包含在内。我们建议您使用当前的SQL Server系统视图。若要查找等效的系统视图或视图,请参阅将SQL Server 2000系统表映射到SQL Server 2005系统视图。 此功能将在未来版本的Microsoft SQL Server中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

    换句话说:是的,您可以使用sysdatabases,但是一旦发布了不再支持sysdatabases的SQL Server版本,可能需要重写所有内容

  • 保留兼容性视图(例如sysdatabases)"因为它们是"在SQL Server 2000中并没有获得新功能。因此,它们包含less information than their new counterparts

      

    兼容性视图公开SQL Server 2000中可用的相同元数据。但是,兼容性视图不会公开与SQL Server 2005及更高版本中引入的功能相关的任何元数据。因此,在使用Service Broker或分区等新功能时,必须切换到使用目录视图。

答案 1 :(得分:1)

SELECT name FROM sysdatabases

检查后 -

SELECT *
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Deprecated Features%'
    AND instance_name = 'sysdatabases'
    AND cntr_value > 0

并阅读已弃用的对象

简短回答:如果可能,尝试仅使用sys schema中的对象 -

SELECT * FROM sys.databases