从数据库还原时,我需要计算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.
答案 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%'