如题。像是下面的SQL代码,是写在存储过程中调用的,还是在函数中写的啊。我想写好在C#程序中调用,怎么调用呢。变量分别是开始时间和结束时间。--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
gocreate table table_111202(id int)
insert into table_111201 select 2
gocreate 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)
)tinsert into #temp exec(@sql)select * from #temp
--select 其他查询,根据#temp临时表drop table #temp,table_111201,table_111202/***************id
-----------
1
2(2 行受影响)
create table table_111201(id int)
insert into table_111201 select 1
gocreate table table_111202(id int)
insert into table_111201 select 2
gocreate 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)
)tinsert into #temp exec(@sql)select * from #temp
--select 其他查询,根据#temp临时表drop table #temp,table_111201,table_111202/***************id
-----------
1
2(2 行受影响)
create proc get_temp
@start datetime,
@end datetime
as
begin
declare @sql varchar(8000)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)
)texec(@sql)
end
不过这样子还是有很大的漏洞,比如某个日期对应的表不存在,可能还需要加上表是否存在的判断等。
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'
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'--生成该时间段类似表名
;with cte as
(
select 'Table_'+right(convert(varchar(8),dateadd(d,number,@dt1),112),6) as [name]
from master..spt_values
where type='p' and dateadd(d,number,@dt1)<=@dt2
)
--形成动态查询语句
select @sql=isnull(@sql+' union all ','')
+'select * from '
+[name]
+' where cellname='''+@cellname+''''
from sys.objects
where type='U' and [name] in (select [name] from cte)
--执行动态查询语句
exec(@sql)
系统提示:在关键字 'with' 附近有语法错误。
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 '
+[name]
+' where cellname='''+@cellname+''''
from sys.objects
where type='U'
and [name] in (select [name] from (
select 'Table_'+right(convert(varchar(8),dateadd(d,number,@dt1),112),6) as [name]
from master..spt_values
where type='p' and dateadd(d,number,@dt1)<=@dt2)t)
--执行动态查询语句
exec(@sql)
谢谢你,把那个【sys.objects】改成【sysobjects】就可以了。问题解决了。