SELECT O.name
FROM SYSOBJECTS AS O
INNER JOIN SYSINDEXES AS I
ON O.ID = I.ID AND O.XTYPE = 'U'
AND (
O.name IN ('client_dutyUser', 'client_workingstatusdata', 'mem_localdiscountaccount')
OR O.name LIKE 'hst_%' OR O.name LIKE 'RNRecord%' OR O.name LIKE 'report%')
AND I.rowcnt > 0
AND I.INDID < 2
ORDER BY O.name;
这个是查SQL2000系统表中符合条件的用户表名称;
我现在的做法是取出来之后遍历这个记录集,然后在程序中对每个表名称再分别查询:
SELECT COUNT(*) FROM 表名称 WHERE 比较字段 < 指定时间 ;
这样凡是有记录数的才是我真正所需要的表;
其中 表名称 是上面获取的自然不必多说;
比较字段 这个是每个表都会有这么个时间字段,但字段的位置和名称都可能不同,这应该就是我不会写的难点;
指定时间这个好说,是一个固定的时间值,所有的子查询都是这个值;
----------------------------------------------------------------------------------------------------
我想问,能不能一条语句就获取到我真正想要的那些表名?就是满足子查询条件,记录数大于0的表;
我在用一个ADO模块来访问的,他只能在程序里执行语句、查询记录,不能写变量什么的哈;
所以我要一条语句可以完成的,不知道是否可行,谢谢!!!
------解决方案--------------------
-- 拼接sql语句
declare @cmdText varchar(max)
-- 表名-比较字段对应表 需人工维护
;with Mapping (tableName, colName) as
(
select '表1', '比较字段1' union all
select '表2', '比较字段2'
)
, T1 as
(
SELECT O.name
FROM SYSOBJECTS AS O INNER JOIN
SYSINDEXES AS I ON O.ID = I.ID
WHERE O.XTYPE = 'U'
AND ( O.name IN ('client_dutyUser', 'client_workingstatusdata', 'mem_localdiscountaccount') OR O.name LIKE 'hst_%' OR O.name LIKE 'RNRecord%' OR O.name LIKE 'report%')
AND I.rowcnt > 0 AND I.INDID < 2
)
-- 生成形如 select tabelName='tableA', rowCnt=(select count(*) from tableA where colA<指定时间) union all...的语句
select @cmdText = @cmdText + 'union all select tableName=''' + T1.tableName + ''', rowCnt=(select count(*) from ' + T1.tableName + ' where ' + T1.colName + '<指定时间)'
from Mapping inner join
T1 on Mapping.tableName = T1.name
-- 去掉第一个union all
set @cmdText = stuff(@cmdText, 1, 11, '')
-- print (@cmdText)
exec (@cmdText)