当从数据库恢复时,我需要计算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%'