数据查询的另类需求


    前几天在网上有个网友有这样一个需求:

    统计某个数据库中,所有包含A字段的表,其中A字段(假设: varchar)的值为'abc'的记录共有多少条?  

思路:
    1、查询出所有用户表
    2、对所有表进行遍历,查出包含此字段的表
    3、将各表的记录数插入某个表来进行统计(当然也可以声明变量来存储,采用表主要是可以对查询结果进行分析)

    下面是我的写法。我以pubs为例:GetAllRecordsNum 'state','ca' ,调用成功,共19条记录。

    大家有什么好的写法可以讨论下!
-- --创建表来存储查询结果
create   table  result(
tblName 
varchar ( 20 ),   -- 包含所查字段的表的表名
colName  varchar ( 20 ),   -- 所查字段
colValue  varchar ( 20 ),  -- 所查字段值
recordsNum  int ,        -- 对应表的记录数
flag  varchar ( 2 ),       -- 统计之用
searchTime  datetime     -- 查询时间
)

-- --查询记录数并将其插入result表
create    procedure  GetRecordsNum

@table   varchar ( 20 ),     -- 表名
@colname   varchar ( 20 ),   -- 列名
@colvalue   varchar ( 20 )   -- 列值

as
   
exec (
        
' insert into result(tblName,colName,colValue,recordsNum,flag)
        select 
''' +   @table   +   ''' , ''' +   @colname   +   ''' , ''' +   @colvalue   +   ''' ,count(1),1
        from 
'   +   @table   +   '
        where 
'   +   @colname   +   ' = '''   +   @colvalue   +   '''' )

-- --统计查询结果
create   procedure  GetAllRecordsNum

@colName   varchar ( 20 ),   -- 列名
@colValue   varchar ( 20 )   -- 列值

as

declare   @recordsNum   int          -- 总记录数
declare   @table   varchar ( 20 )      -- 表名
declare   @col   int                 -- 表是否包含列 1:包含、0:不含

       
-- 申明游标
        DECLARE  tbl_cursor  CURSOR   FOR

       
-- 选出所有用户表
        select   [ name ]   from  sysobjects  where  type = ' u '

       
OPEN  tbl_cursor
       
FETCH   NEXT   FROM  tbl_cursor
       
INTO   @table

       
WHILE   @@FETCH_STATUS   =   0
       
BEGIN

            
-- 判断该表是否包含该列
             select   @col = count ( 1 from  syscolumns  where   [ name ] = @colName   and   [ id ] = object_id ( @table )

            
-- 包含则进行统计
             if   @col = 1
                    
exec  GetRecordsNum   @table , @colname , @colvalue    -- 调用存储过程 GetRecordsNum

       
FETCH   NEXT   FROM  tbl_cursor   
       
INTO   @table

       
END

       
CLOSE  tbl_cursor   -- 关闭游标
        DEALLOCATE  tbl_cursor

       
-- 统计结果
        select   sum (recordsNum)  from  result  where  flag = ' 1 '
       
update  result  set  flag = ' 0 '   where  flag = ' 1 '

   

你可能感兴趣的:(查询)