当前位置: 代码迷 >> Sql Server >> 求一条SQL语句,不知道可否可以实现。
  详细解决方案

求一条SQL语句,不知道可否可以实现。

热度:38   发布时间:2016-04-24 10:04:57.0
求一条SQL语句,不知道能否可以实现。。。
本帖最后由 shier2817 于 2014-07-31 16:52:51 编辑

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)
  相关解决方案