SQL如何遍历所有表的一个字段来查询数据

时间:2022-09-14 15:06:25
如题。
就是说如果数据库每天产生一张表,比如Table_120201,Table_120202,Table_120203,Table_120204,Table_120205......
还有一个小区名cellname字段,这个字段存在于每一张表,就是说每一张表都有这个小区的记录。


现在举例要查询【一段时间内】小区名为‘Acell’的,从2012-02-01到2012-02-07的记录,怎么遍历这些表【从Table_120201--Table_120207】呢。

在线等,谢谢。

22 个解决方案

#1


将所有表联合建立视图,然后在视图里查找。

你这些表若是数据大可以用分区来提高速度,若是数据小可以按月、按年建表。

#2


系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。

#3


视图也是可以随表的创建而改的。

是美女吗?不是可不等了。

#4


表名称有规律,可以动态去拼接SQL的查询语句,具体需要查找什么。

#5


引用 4 楼 acherat 的回复:
表名称有规律,可以动态去拼接SQL的查询语句,具体需要查找什么。



要查询一个小区【CellName】在一段时间内[querytime]的掉话率[Dhl]信息。

#6


引用 3 楼 yanyuchonglou 的回复:
视图也是可以随表的创建而改的。

是美女吗?不是可不等了。


是帅哥吗?不是帅哥就不说谢谢了。

#7


我自将心向明月,奈何明月照沟渠。

若是还不能解决再联系。

#8


> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?

#9



--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
go

create table table_111202(id int)
insert into table_111201 select 2
go

create table #temp(id int) -- 具体的字段

declare @start datetime
declare @end datetime
declare @sql varchar(8000)
set @start = '2011-12-01'
set @end = '2011-12-02'

select @sql = isnull(@sql+' union all ','')+'select * from table_'+date
from(
select right(convert(varchar(8),dateadd(dd,number,@start),112),6) date
from master..spt_values
where [type] = 'p' and number between 0 and datediff(dd,@start,@end)
)t

insert into #temp exec(@sql)

select * from #temp
--select 其他查询,根据#temp临时表

drop table #temp,table_111201,table_111202

/***************

id
-----------
1
2

(2 行受影响)

#10


引用 8 楼 shshjun 的回复:
> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?


咋个更新?是要用存储过程吧。

#11


引用 2 楼 anya 的回复:
系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。

用游标

declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell’
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor

#12




declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell'
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor


#13


引用 10 楼 anya 的回复:
引用 8 楼 shshjun 的回复:
> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?


咋个更新?是要用存储过程吧。




declare @tableName varchar(max)
declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell' 
--[name]='Acell' 这里是指列的名称,不是指数据! 
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor



#14


引用 9 楼 acherat 的回复:
SQL code

--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
go

create table table_111202(id int)
insert into table_111201 select 2
go

create table #temp(……



谢谢,不过我还是不太懂,真不好意思

#15


引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell'
--打开游标
open @cursor
fetch next from @cursor ……


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell' 
--[name]='Acell' 这里是指列的名称,不是指数据! 
--打开游标
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~谢谢,~~~~~~~~~~~~~~~~~~~~~~这个能看懂。


但是建立视图名View是在哪里呢,而且这个时间是不固定的【2012-02-07 and 2012-02-10'只是举个例子】。我的表名分别是Table20110101\Table20110102\Table20110103\.......Table20120201\Table20120102\Table20120103\

#16


引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游标
open @cursor
fe……



怎么调用呢

#17


引用 16 楼 anya 的回复:
引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游……


不能放在视图中!

你可以放在存储过程中调用! 

#18


引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游标
open @cursor
fe……


这两个时间不固定你可以作为参数传到存储过程!

在存储过程中声明两个参数! 

[datetime] between '+@变量1+' and '+@变量2+''

这里你用两个变量替代好了!

#19


declare @dt1 datetime,@dt2 datetime
declare @cellname varchar(10)
declare @sql nvarchar(max)
--设置起止日期
set @dt1='2012-02-01'
set @dt2='2012-02-07'
--设置小区名
set @cellname='Acell'
--形成动态查询语句
select @sql=isnull(@sql+' union all ','')
+'select * from Table_'
+right(convert(varchar(8),dateadd(d,number,@dt1),112),6)
+' where cellname='''+@cellname+''''
from master..spt_values
where type='p' and dateadd(d,number,@dt1)<=@dt2
--执行动态查询语句
exec(@sql)
/*
如果将上面这句改成 select @sql,则你会得到这样的字串(复制网格中的内容):
select * from Table_120201 where cellname='Acell' union all select * from Table_120202 where cellname='Acell' union all select * from Table_120203 where cellname='Acell' union all select * from Table_120204 where cellname='Acell' union all select * from Table_120205 where cellname='Acell' union all select * from Table_120206 where cellname='Acell' union all select * from Table_120207 where cellname='Acell'
这就是你要的遍历各表的查询语句
*/

#20


引用 19 楼 qianjin036a 的回复:
SQL code
declare @dt1 datetime,@dt2 datetime
declare @cellname varchar(10)
declare @sql nvarchar(max)
--设置起止日期
set @dt1='2012-02-01'
set @dt2='2012-02-07'
--设置小区名
set @cellname='Acell'
--形成动态……



是的,这个我验证了,查询分析器里执行一目了然了,谢谢你。

#21


引用 18 楼 hncelfhv 的回复:
引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游……



这个也验证合适。谢谢

#22


感谢大家,结贴。

#1


将所有表联合建立视图,然后在视图里查找。

你这些表若是数据大可以用分区来提高速度,若是数据小可以按月、按年建表。

#2


系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。

#3


视图也是可以随表的创建而改的。

是美女吗?不是可不等了。

#4


表名称有规律,可以动态去拼接SQL的查询语句,具体需要查找什么。

#5


引用 4 楼 acherat 的回复:
表名称有规律,可以动态去拼接SQL的查询语句,具体需要查找什么。



要查询一个小区【CellName】在一段时间内[querytime]的掉话率[Dhl]信息。

#6


引用 3 楼 yanyuchonglou 的回复:
视图也是可以随表的创建而改的。

是美女吗?不是可不等了。


是帅哥吗?不是帅哥就不说谢谢了。

#7


我自将心向明月,奈何明月照沟渠。

若是还不能解决再联系。

#8


> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?

#9



--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
go

create table table_111202(id int)
insert into table_111201 select 2
go

create table #temp(id int) -- 具体的字段

declare @start datetime
declare @end datetime
declare @sql varchar(8000)
set @start = '2011-12-01'
set @end = '2011-12-02'

select @sql = isnull(@sql+' union all ','')+'select * from table_'+date
from(
select right(convert(varchar(8),dateadd(dd,number,@start),112),6) date
from master..spt_values
where [type] = 'p' and number between 0 and datediff(dd,@start,@end)
)t

insert into #temp exec(@sql)

select * from #temp
--select 其他查询,根据#temp临时表

drop table #temp,table_111201,table_111202

/***************

id
-----------
1
2

(2 行受影响)

#10


引用 8 楼 shshjun 的回复:
> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?


咋个更新?是要用存储过程吧。

#11


引用 2 楼 anya 的回复:
系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。

用游标

declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell’
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor

#12




declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell'
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor


#13


引用 10 楼 anya 的回复:
引用 8 楼 shshjun 的回复:
> 系统每天自动创建一张表。所以视图还不好建立,因为每天的表是即时产生的。
那系统不是也可以每天在建表之后更新你的视图吗?


咋个更新?是要用存储过程吧。




declare @tableName varchar(max)
declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell' 
--[name]='Acell' 这里是指列的名称,不是指数据! 
--打开游标
open @cursor
fetch next from @cursor into @tableName
while(@@fetch_status=0)
begin
exec ('update ['+@tableName+'] set cl='更新的内容' where [datetime] between 2012-02-07 and 2012-02-10')
fetch next from @cursor into @tableName
end
close @cursor
deallocate @cursor



#14


引用 9 楼 acherat 的回复:
SQL code

--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
go

create table table_111202(id int)
insert into table_111201 select 2
go

create table #temp(……



谢谢,不过我还是不太懂,真不好意思

#15


引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell'
--打开游标
open @cursor
fetch next from @cursor ……


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

首先找出数据库中有多少个表中有这个字段!
select object_name(object_id)  from sys.columns where [name]='Acell' 
--[name]='Acell' 这里是指列的名称,不是指数据! 
--打开游标
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~谢谢,~~~~~~~~~~~~~~~~~~~~~~这个能看懂。


但是建立视图名View是在哪里呢,而且这个时间是不固定的【2012-02-07 and 2012-02-10'只是举个例子】。我的表名分别是Table20110101\Table20110102\Table20110103\.......Table20120201\Table20120102\Table20120103\

#16


引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游标
open @cursor
fe……



怎么调用呢

#17


引用 16 楼 anya 的回复:
引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游……


不能放在视图中!

你可以放在存储过程中调用! 

#18


引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游标
open @cursor
fe……


这两个时间不固定你可以作为参数传到存储过程!

在存储过程中声明两个参数! 

[datetime] between '+@变量1+' and '+@变量2+''

这里你用两个变量替代好了!

#19


declare @dt1 datetime,@dt2 datetime
declare @cellname varchar(10)
declare @sql nvarchar(max)
--设置起止日期
set @dt1='2012-02-01'
set @dt2='2012-02-07'
--设置小区名
set @cellname='Acell'
--形成动态查询语句
select @sql=isnull(@sql+' union all ','')
+'select * from Table_'
+right(convert(varchar(8),dateadd(d,number,@dt1),112),6)
+' where cellname='''+@cellname+''''
from master..spt_values
where type='p' and dateadd(d,number,@dt1)<=@dt2
--执行动态查询语句
exec(@sql)
/*
如果将上面这句改成 select @sql,则你会得到这样的字串(复制网格中的内容):
select * from Table_120201 where cellname='Acell' union all select * from Table_120202 where cellname='Acell' union all select * from Table_120203 where cellname='Acell' union all select * from Table_120204 where cellname='Acell' union all select * from Table_120205 where cellname='Acell' union all select * from Table_120206 where cellname='Acell' union all select * from Table_120207 where cellname='Acell'
这就是你要的遍历各表的查询语句
*/

#20


引用 19 楼 qianjin036a 的回复:
SQL code
declare @dt1 datetime,@dt2 datetime
declare @cellname varchar(10)
declare @sql nvarchar(max)
--设置起止日期
set @dt1='2012-02-01'
set @dt2='2012-02-07'
--设置小区名
set @cellname='Acell'
--形成动态……



是的,这个我验证了,查询分析器里执行一目了然了,谢谢你。

#21


引用 18 楼 hncelfhv 的回复:
引用 15 楼 anya 的回复:
引用 12 楼 hncelfhv 的回复:
SQL code


declare @cursor cursor
set @cursor=cursor for
首先找出数据库中有多少个表中有这个字段!
select object_name(object_id) from sys.columns where [name]='Acell'
--打开游……



这个也验证合适。谢谢

#22


感谢大家,结贴。