如何统计SQL Server 2000中的对象数量并获得其修改日期?



当从数据库恢复时,我需要计算SQL Server 2000中的对象数量,以确保恢复包括最新的更新。我还想获得对象创建或修改的最新日期。

特别想要获得表的数量、视图的数量、udfs的数量、进程的数量以及创建或修改的日期。

select 
    count(xtype) as [MyCounts], 
    crdate as [CreateDate], 
    refdate as [ModifiedDate] 
from sysobjects 
where xtype like 'U%'  
--does not appear to be working correctly.

一个非常基本的解决方案就是简单地使用分组和聚合,如下所示:

SELECT
  xtype,
  total_count  = COUNT(*),
  last_crdate  = MAX(crdate),
  last_refdate = MAX(refdate)
FROM sysobjects
GROUP BY xtype

然而,这返回当前数据库中所有类型对象的信息,包括您在问题中没有提到的对象,如约束,键等。

因此,您可能希望通过在xtype上应用过滤器来缩小结果列表,如下所示:

SELECT
  xtype,
  total_count  = COUNT(*),
  last_crdate  = MAX(crdate),
  last_refdate = MAX(refdate)
FROM sysobjects
WHERE xtype IN ('U', 'V', 'FN', 'TF', 'IF', 'P')
GROUP BY xtype

注意SQL Server中有三种类型的udf。它们在sysobjects中被指定如下:

  • FN -标量函数

  • TF -多语句表值函数

  • IF - inline表值函数

因此,如果使用上述脚本,有关函数的信息将分散在三行中。如果您希望将这些结果分组在一行中,那么您的查询必须稍微复杂一些。例如,像这样:

SELECT
  type,
  total_count  = COUNT(*),
  last_crdate  = MAX(crdate),
  last_refdate = MAX(refdate)
FROM (
  SELECT
    type = CASE
      WHEN xtype = 'U' THEN 'table'
      WHEN xtype = 'V' THEN 'view'
      WHEN xtype = 'P' THEN 'proc'
      WHEN xtype IN ('FN', 'TF', 'IF') THEN 'udf'
    END,
    crdate,
    refdate
  FROM sysobjects
  WHERE xtype IN ('FN', 'TF', 'IF', 'P', 'U', 'V')
) s
GROUP BY type

在这里,原始类型首先被基于xtype值的自定义类型替换。与函数相关的所有行都被简单地标记为udf,而不管实际的函数类型是什么,因此最后您可以简单地按自定义类型列分组并获得必要的总数,现在将有关函数的信息收集在一行中。

参考:

  • 系统。sysobjects (transact - sql)

您应该发布您得到的错误,以便于诊断。然而,查看您的查询,这可能是因为您缺少GROUP BY来伴随您试图做的COUNT聚合。

现在,真正的问题是如何显示COUNT聚合以及特定于行的信息(如创建的日期)?

如果有5个视图和4个进程,每一行是什么样子?列标题是什么?COUNT是否显示在每一行以及该项目的详细信息,就像这样?

select 
    c.cnt as [MyCounts], 
    s.name as [Name],
    s.xtype as [Type],
    s.crdate as [CreateDate], 
    s.refdate as [ModifiedDate] 
from 
    sysobjects s
    inner join (select COUNT(1) cnt, xtype from sysobjects group by xtype) c
        on  s.xtype = c.xtype
where 
    s.xtype like 'U%'

最新更新