如何计算SQL Server 2000中的对象数并获取其修改日期?

时间:2011-09-08 21:57:34

标签: tsql sql-server-2000

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

特别想获得表数,视图数,udf数,sproc数以及创建或修改日期的计数。

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

2 个答案:

答案 0 :(得分:2)

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

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 - 内联表值函数

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

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,因此最后您只需按自定义类型列进行分组并获得必要的总计,现在将函数的信息收集到一个行。

参考:

答案 1 :(得分:1)

您应该发布您正在获取的错误,以便更容易诊断。但是,查看您的查询时,可能是因为您错过了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%'