當前位置:首頁 » 編程語言 » 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