当前位置:首页 » 编程语言 » sql每个月自动生成表
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql每个月自动生成表

发布时间: 2022-04-19 16:20:26

⑴ 在sql中怎么查找自动生成表中的数据有一个表是每天根据年月日为表名生成的一张表,怎么查询里面的数据

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE type = 'P' AND name = 'P_XXX')
BEGIN
DROP Procere [dbo].[P_XXX]
END
GO

CREATE PROCEDURE dbo.P_XXX
(
@a varchar(100),
@b varchar(100)
)
AS

SET NOCOUNT ON

SET XACT_ABORT ON

BEGIN

DECLARE @sqlstr NVARCHAR(MAX)
DECLARE @date DATETIME
SET @date = GETDATE()

SET @sqlstr = 'select * from T_XXX_'
SET @sqlstr = @sqlstr + CAST(YEAR(@date) AS VARCHAR(4))
SET @sqlstr = @sqlstr + CAST(MONTH(@date) AS VARCHAR(2))
SET @sqlstr = @sqlstr + CAST(DAY(@date) AS VARCHAR(2))
SET @sqlstr = @sqlstr + ' where columna = ''' + @a + ''' and columnb = '''
+ @b + ''''
EXEC sp_executesql @sqlstr
----把EXEC sp_executesql @sqlstr 改成Print @sqlstr再执行可查看@sqlstr拼接效果
RETURN @@ERROR

END

SET NOCOUNT OFF
SET XACT_ABORT OFF
GO

⑵ Sql Server 如何按每个月自动生成一张表。

使用job,每个月初创建上个月的表,并将统计 数据填入。

⑶ sql语句,循环生成一到十二月的汇总表

Select xxxxxxxxxx,xxx,xxx,xxx from myTable
where xxxx
group by xxx,xxx,xxx
关键在于分组group by ,要你一直这么Union 那要1年365天你还得写365个union?
顺便说下,按你的意思的话,用报表中的矩阵很轻松就能解决。

⑷ MySQL如何每个月自动创建一张表,以年月做为

这个要建立一个作业啊

作业运行时间放在月初,sql脚本如下所示:

---sqlserver
declare@namevarchar(10)
set@name=convert(varchar(2),year(getdate()))+convert(varchar(2),month(getdate()))

ifnotexists(='u'andname=@name)
begin
---建表
exec
('
createtable'+@name+'(
列名...
)
');
end
go

试一试,如有疑问,及时沟通!

⑸ SQL创建新表

先建一个作为全局变量的表

create table vi(i int)

---建表
create proc createtable
as
begin
declare @sql as varchar(1000),@si as varchar(2)
declare @i as integer
select @i=isnull(max(i),0)+1 from vi

if len(@i)<2
begin
set @si='0'+convert(varchar(2),@i)
end
else
begin
set @si=convert(varchar(2),@i)
end
set @sql='create table table'+@si+'( name nvarchar(30), sex nvarchar(30),Address nvarchar(30))'
print(@sql)
exec (@sql)
insert into vi values(@i)
end
--之后做一个排程

---用表,变量为月
create proc usetable
@m varchar(2)
as
begin
declare @sql as varchar(1000),@si as varchar(2)
set @si=@m
if len(@si)<2
begin
set @si='0'+@si
end
set @sql='select * from table'+@si
exec (@sql)
end
记住,有变量的都放在一个字符串中,之后exec一下就可以了

⑹ MySQL如何每个月自动创建一张表,以年月做为表名

我正好有楼主类似的需求,每个季度为几个表增加一个分区,表的基本名称是在一个叫设备类型的表里,每天计划执行一个过程,在过程里从系统表中判断是否已经创建了相关的分区,如果没创建就创建它
楼主可以参考一下,记得在my.ini文件里配置event_scheler=on

/**
定时每天检查各个设备类型的历史数据表,如果历史数据表的所在分区已经
接近当前日期,则为此设备类型追加分区
*/

--得到按月分区的日期值
delimiter;
;
delimiter;;
()returnsINT
begin
declarev_todaydatetimedefaultdate_add(now(),INTERVAL2month);
returnyear(v_today)*100+month(v_today);
end;;

--得到按季度分区的日期值
delimiter;
;
delimiter;;
()returnsint
begin
declarev_todaydatetimedefaultdate_add(now(),interval3month);
declarev_monthint;

setv_month=month(v_today);
ifv_month=1orv_month=2orv_month=3then
setv_today=DATE_ADD(v_today,INTERVAL(4-v_month)month);
elseifv_month=4orv_month=5orv_month=6THEN
setv_today=DATE_ADD(v_today,INTERVAL(7-v_month)month);
elseifv_month=7orv_month=8orv_month=9THEN
setv_today=date_add(v_today,INTERVAL(10-v_month)month);
ELSE
setv_today=date_add(v_today,INTERVAL(13-v_month)month);
endif;

returnyear(v_today)*100+month(v_today);
end;;

--得到按半年分区的日期值
delimiter;
;
delimiter;;
()returnsint
begin
declarev_todaydatetimedefaultdate_add(now(),interval6month);
declarev_monthint;

setv_month=month(v_today);

ifv_month<=6THEN
setv_today=date_add(v_today,INTERVAL(7-v_month)month);
else
setv_today=DATE_ADD(v_today,INTERVAL(13-v_month)month);
endif;

returnyear(v_today)*100+month(v_today);
end;;

--维护按年分区
delimiter;
;
delimiter;;
()returnsint
begin
declarev_todaydatetimedefaultdate_add(now(),INTERVAL2year);
returnyear(v_today)*100;
end;;


delimiter;
;
delimiter;;
()
BEGIN

declarev_sqlvarchar(2000);
declarev_cntint;
declarev_deviceTypeIdint;
declarev_tablenamevarchar(50);
declarev_tablename_analogvarchar(50);
declarev_tablename_digitalvarchar(50);
declarev_partitionTypeint;
declarev_fileDirvarchar(1000);
declarev_tablenamesvarchar(1000)default'';
declarev_intDateint;
declarev_partitionNamevarchar(100);
declaredoneintdefault0;
declarec_deviceTypecursor
forselectId,TableName,PartitionType,DataFileDir
fromtbDeviceType
whereGenerated=1;
=1;

(`CreatedDateTime`,`LogContent`)
Values(Now(),'spMaintainPartitionsstart......');

openc_deviceType;
deviceType_loop:LOOP

fetchc_deviceTypeintov_deviceTypeId,v_tablename,v_partitionType,v_fileDir;

setv_fileDir=replace(v_fileDir,'\','/');
iflocate(':',v_fileDir)>0andlocate(':/',v_fileDir)=0then
setv_fileDir=replace(v_fileDir,':',':/');
endif;

ifdone=1then
leavedeviceType_loop;
endif;

setv_intDate=null;
ifv_partitionType=1then
setv_intDate=fnGetPartitionDateForMonth();
ELSEIFv_partitionType=2THEN
setv_intDate=fnGetPartitionDateForQuarter();
ELSEIFv_partitionType=3then
setv_intDate=fnGetPartitionDateForHalfYear();
elseifv_partitionType=4then
setv_intDate=fnGetPartitionDateForYear();
endif;

ifv_intDateisnullthen
(`CreatedDateTime`,`LogContent`)
values(Now(),Concat('DeviceTypeId=',cast(v_deviceTypeIdAschar(10)),'didnotdefineparititionschele'));
else

setv_partitionName=concat('p',cast(v_intDateaschar(6)));

--模拟量表
setv_tablename_analog=concat(v_tablename,'_Analog');
selectcount(*)intov_cnt
frominformation_schema.`TABLES`where`TABLE_SCHEMA`=database()and`table_name`=v_tablename_analog;


ifv_cnt>0then

selectcount(*)intov_cnt
from
information_schema.`PARTITIONS`
where
TABLE_SCHEMA=database()andtable_name=v_tablename_analogandpartition_name=v_partitionName;

ifv_cnt=0then
setv_sql=CONCAT('altertable',v_tablename_analog,'addpartition(partition',v_partitionName,'valueslessthan(',cast(v_intDateaschar(6)),')datadirectory=''',v_fileDir,'''indexdirectory=''',v_fileDir,''')');
(`CreatedDateTime`,`LogContent`)
Values(Now(),concat('sql=''',v_sql));

set@sql=v_sql;
preparecmdfrom@sql;
executecmd;
deallocatepreparecmd;

(`CreatedDateTime`,`LogContent`)
values(Now(),concat('executecomplete:',v_sql));
endif;
endif;

--数字量表
setv_tablename_digital=concat(v_tablename,'_Digital');
selectcount(*)intov_cnt
frominformation_schema.`TABLES`where`TABLE_SCHEMA`=database()and`table_name`=v_tablename_digital;

ifv_cnt>0then

selectcount(*)intov_cnt
from
information_schema.`PARTITIONS`
where
TABLE_SCHEMA=database()andtable_name=v_tablename_digitalandpartition_name=v_partitionName;

ifv_cnt=0then
setv_sql=CONCAT('altertable',v_tablename_digital,'addpartition(partition',v_partitionName,'valueslessthan(',cast(v_intDateaschar(6)),')datadirectory=''',v_fileDir,'''indexdirectory=''',v_fileDir,''')');

(`CreatedDateTime`,`LogContent`)
Values(Now(),concat('sql=''',v_sql));

set@sql=v_sql;
preparecmdfrom@sql;
executecmd;
deallocatepreparecmd;

(`CreatedDateTime`,`LogContent`)
values(Now(),concat('executecomplete:',v_sql));

endif;
endif;

endif;

endloopdeviceType_loop;
closec_deviceType;

END;;

delimiter;

dropeventifexistse_DataPartitionMaintain;
createevente_DataPartitionMaintain
onSCHEDULEevery60Second
oncompletionPRESERVE
docallspMaintainPartitions();

setglobalevent_scheler=on;

⑺ 怎么利用sql根据流水账生成月报表

您好:

主要语句如下:

SELECTSUM(收入)收入合计
,SUM(支出)支出合计
FROM流水表
WHERE时间<='本月期初时间'
AND时间>'下月期初时间'

详细的需要根据具体表结构和需求来定。。。

⑻ SQL如何实现自动生成带序号的表格

--创建字符串拆分函数
CreateFunction[dbo].[f_split1](@SourceSqlVarchar(max),@StrSeprateVarchar(2))
Returns@tempTable(idIntIdentity(1,1),colVarchar(max))
As
begin
Declare@chasVarchar(max)
Set@SourceSql=@SourceSql+@StrSeprate
While(@SourceSql<>'')
Begin
Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)
Insert@temp(col)Values(@ch)
Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')
End
Return
End
--调用
Select*fromdbo.f_split1('ABCDEF','')

⑼ SQL怎样动态查询按月生成的表数据

难点在于如何动态生成每月的日期数据,使用以下语句可以生成每月日期数据,然后再关联需要显示的其他数据。

生成每月动态数据代码:

declare@BeginMonthasVarchar(7)--需要生成的年份和月份,例如:2015-01
set@BeginMonth='2015-03'
selecttop(datediff(d,@BeginMonth+'-01',dateadd(m,1,@BeginMonth+'-01')))@BeginMonth+'-'+cast((row_number()over(orderbya.object_id))asvarchar(2))asIDfromsys.all_columnsa,sys.all_columnsb