有12张月表,366张天表
月表命名规则 log+month 如log1 log2 ... log12
天表命名规则 log_month_day 如log_1_1 log_2_29 ... log_8_31 ... log_10_1 ... log_12_31现在要给这些表建立13张视图,建立的规则为
CREATE VIEW dbo.v_log
AS
SELECT * FROM 表名
UNION ALL
SELECT * FROM 表名
UNION ALL
...要求建立13张视图,一张年视图v_log 要求关联12张月表 ,12张月视图 命名规则为v_log_month 如v_log_1 ... v_log_12
要求每个月视图关联该月的所有天视图。脑子彻底乱了,老大们帮帮忙拼个动态SQL解决吧,不要用体力活~~~
月表命名规则 log+month 如log1 log2 ... log12
天表命名规则 log_month_day 如log_1_1 log_2_29 ... log_8_31 ... log_10_1 ... log_12_31现在要给这些表建立13张视图,建立的规则为
CREATE VIEW dbo.v_log
AS
SELECT * FROM 表名
UNION ALL
SELECT * FROM 表名
UNION ALL
...要求建立13张视图,一张年视图v_log 要求关联12张月表 ,12张月视图 命名规则为v_log_month 如v_log_1 ... v_log_12
要求每个月视图关联该月的所有天视图。脑子彻底乱了,老大们帮帮忙拼个动态SQL解决吧,不要用体力活~~~
解决方案 »
- 错误 2 验证 (XHTML 1.0 Transitional): 在“body”元素的开始标记与结束标记之间不允许出现文本。 D:\asp\asp.netC\
- SQLSERVER2005中服务无法启动的麻烦问题!请高手指教!
- 数据库日志可以记录下每个动作吗?
- 可能大家都会碰到过这个问题,如何解决异地数据存储、共享?(来者有分)
- 主键设置
- 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--日志--收缩操作各相当于什么命令
- sql插入問題
- 事务出错,不知如何处理,请教各位大侠.急!谢了
- 急急急!!!关于Foxbase中的数据类型转换问题。。。急需帮忙:)
- 如何按生日离今天的天数排序
- 求一句sql
- 三张表转换的问题?sql语句实现(急)
然后create view as
select * from openrowset(....,'exec 这个存储过程 参数,...)
即可。不同的的视图建时使用不同的参数。可以简化你的工作量,不过不推荐。还是老老实实写吧
比如log_1_1 log_2_29 log_10_31 log_12_31
现在要给所有的表加一列newcol int, 并且给所有表以前的记录该列赋值为9,这个SQL应该怎么写 另外,每个表里大概有1000W的记录 这个效率也是要考虑的~
set nocount on
declare @dt datetime set @dt='2008-01-01'
declare @tbname varchar(50),@sql varchar(8000)
while @dt<=cast('2008-12-31' as datetime)
begin
set @sql='alter table log_'+rtrim(month(@dt))+'_'+rtrim(day(@dt))+' add newcol int'
exec(@sql)
set @sql='update log_'+rtrim(month(@dt))+'_'+rtrim(day(@dt))+' set newcol=9'
exec(@sql)
set @dt=dateadd(day,1,@dt)
print('log_'+rtrim(month(@dt))+'_'+rtrim(day(@dt))+' 处理完毕')
end
go
--生成测试表
Declare
@sql varchar(8000),
@Date datetime,
@TableName nvarchar(128)
Select @Date='20080101'
While @Date<='20081231'
Begin
Set @TableName=Quotename('log_'+Rtrim(Month(@Date))+'_'+Rtrim(Day(@Date)))
Set @sql=Isnull(@sql+Char(13)+Char(10),'')+'If Object_id('''+@TableName+''') Is Not Null Drop Table '+@TableName+Char(13)+Char(10)+' Create Table '+@TableName+'(id int identity(1,1),x nvarchar(20))'
If Datediff(day,'20080101',@Date)%20=0
Begin
Exec(@sql)
Set @sql=null
End
Set @Date=@Date+1
End
If @sql>'' Exec(@sql)
Go--创建视图
Declare @x1 varchar(8000)
Declare @x2 varchar(8000)
Declare @x3 varchar(8000)
Declare @x4 varchar(8000)If Object_id('tempdb..#') is not null
Drop Table #
Select id=identity(int,1,1),name Into #
From sys.sysobjects
Where xtype='U' And name like 'log[_]%[_]%'Select @x1=Isnull(@x1+Char(13)+Char(10)+'Union All ','Create view v_log1 As'+Char(13)+Char(10)) +'Select * From '+Quotename(name)
From # Where id<=100
Select @x2=Isnull(@x2+Char(13)+Char(10)+'Union All ','Create view v_log2 As'+Char(13)+Char(10)) +'Select * From '+Quotename(name)
From # Where id Between 101 And 200
Select @x3=Isnull(@x3+Char(13)+Char(10)+'Union All ','Create view v_log3 As'+Char(13)+Char(10)) +'Select * From '+Quotename(name)
From # Where id Between 201 And 300
Select @x4=Isnull(@x4+Char(13)+Char(10)+'Union All ','Create view v_log4 As'+Char(13)+Char(10)) +'Select * From '+Quotename(name)
From # Where id >300Exec ('If Object_id(''v_log1'') Is Not Null Drop View v_log1 ')
Exec (@x1)
Exec ('If Object_id(''v_log2'') Is Not Null Drop View v_log2 ')
Exec (@x2)
Exec ('If Object_id(''v_log3'') Is Not Null Drop View v_log3 ')
Exec (@x3)
Exec ('If Object_id(''v_log4'') Is Not Null Drop View v_log4 ')
Exec (@x4)If Object_id('v_log') Is Not null
Drop View v_log
Go
Create View v_log
As
Select * From v_log1 Union All
Select * From v_log2 Union All
Select * From v_log3 Union All
Select * From v_log4--之所以分开4个视图,是因为“单个查询支持最多有 256 个表源”
From # Where id <=100
From # Where id <=100
Quotename(name) 返回带有分隔符"[]"的 Unicode 字符串
其他就没有什么好解释的了,
要看Create View语句可以使用,Print @x1来查。