编写mysql存储过程,循环的查询到表结构相同的多张表记录并将结果表合并输出。可以查询多天也可查询单天
直接实例代码与注释
CREATE PROCEDURE tableData1(in sTime VARCHAR(255),in eTime VARCHAR(255))
BEGIN #创建传入两个参数的存储过程,sTime开始时间,eTime结束时间
#定义变量
DECLARE date VARCHAR(255);
declare sqlVar varchar(21845);
declare rest int;
declare tableName varchar(1024);
#给初始值 sqlVar为空字符串,因为下边要拼接sql语句
set rest = 100;
set sqlVar='';
#当开始时间等于结束时间时,只拼接一次sql语句-实现可以只查询一天数据
if sTime = eTime THEN
SET date = DATE_FORMAT(sTime,"%Y-%m-%d");
set sqlVar=CONCAT(sqlVar," (SELECT *
FROM data_detail_",sTime," WHERE XXX
#rest初始值是随便给的大于0的值。所以一定会进入循环。接下来在下边使用函数DATEDIFF用结束时间减去开始时间
#给rest重新赋值,当大于0时说明还没结束继续拼接sql,当等于或小于零时说明应该结束了,不需要继续往下拼接sql
while rest > 0 do
#转换日期格式,根据您自己的表结构来改,我是需要的
SET date = DATE_FORMAT(sTime,"%Y-%m-%d");
#使用开始时间拼接上字符串成为表名
set tableName=CONCAT('data_detail_',sTime);
#查询是否存在当前表名,赋值个数给cnt
select count(1) from information_schema.tables where table_name = tableName into @cnt;
#判断表名是否存在,当表不存在时直接跳过,不判断的话会报错
if @cnt != 0 then
#最最最重要的一点,当结束时间减去开始时间为1时,需要走else拼接上后边的的union all 。
#当结束时间减去开始时间为1时,说明已经到达结束时间的前一天,并且在最后DATE_ADD将前一天日期加1已经到达结束时间。最后不需要再拼接上一个union all
if rest=1 then
set sqlVar=CONCAT(sqlVar," (SELECT *
FROM data_detail_",sTime," WHERE XXX
set sqlVar=CONCAT(sqlVar," (SELECT
FROM data_detail_",sTime," WHERE XXX
)",' UNION all');
END IF;
END if;
#判断到达某日期,当rest为1时说明已经到达结束日期前一天
set rest = DATEDIFF(eTime,sTime);
#当前日期加1
set sTime = DATE_FORMAT(DATE_ADD(sTime,INTERVAL 1 day),'%Y%m%d');
#结束循环与判断
END while;
END if;
#赋值用户变量
set @v_s=sqlVar;
#预定义sql语句
prepare stmt from @v_s;
#执行预定义sql语句
EXECUTE stmt;
#释放资源
DEALLOCATE PREPARE stmt;
call tableData1(‘20211006’,‘20211008’);
结果长这个样子
1.创建存储过程语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
2.变量的定义与赋值:
局部变量
DECLARE variable_name datatype(size) DEFAULT default_value;
DECLARE相当于关键字,有点类似var,表示定义一个变量;然后variable_name是你指定的变量名称;datatype表示数据类型而括号内的size表示对应类型的格式比如varchar(50)这样子,这里需要注意的是datatype只能是MySql支持的那些基本数据类型;DEFAULT关键字指明了变量的默认值为default_value。
通过SET赋值: SET variable_name = XXX
用户变量
用户变量不需要声明,可以直接使用,用户变量以@var_name的形式命名变量,变量名必须以@开头
赋值语法; set @varName=value;
只说了我用到的两种变量,其他变量查阅其他资料哦
3.While循环语句结构:
while(表达式) do
…
end while;
与其他语言while循环大同小异了其实,不难理解当表达式结果为false时退出循环
4.if判断语句:
IF expression THEN
statements;
ELSE
else-statements;
END IF;
5.union与union all 的区别
对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录
编写mysql存储过程,循环的查询到表结构相同的多张表记录并将结果表合并输出。可以查询多天也可查询单天直接实例代码与注释CREATE PROCEDURE tableData1(in sTime VARCHAR(255),in eTime VARCHAR(255)) BEGIN #创建传入两个参数的存储过程,sTime开始时间,eTime结束时间 #定义变量 DECLARE date VARCHAR(255); declare sqlVar varchar(21845); declare
From : http://www.netingcn.com/mysql-procedure-muti-cursor.html
mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下:
先创建一张表,插入一些测试数据:
DROP TABLE IF EXISTS netingcn_proc_test;
CREATE TABLE `netingcn_proc_test...
CREATE DEFINER=`root`@`localhost` PROCEDURE `获取有关键词数据test2`()
BEGIN
#Routine body goes here...
DECLARE nums INT DEFAULT 1;
DECLARE keywords varchar(255);
DECLAR
'设置合并后的目标工作表
Set DestWS = ThisWorkbook.Sheets.Add(After:= _
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
DestWS.Name = "合并结果"
'关闭屏幕更新,加快处理速度
Application.ScreenUpdating = False
'循环遍历每个源工作表
For Each SourceWS In ThisWorkbook.Sheets
'跳过目标工作表和合并结果工作表
If SourceWS.Name <> DestWS.Name Then
With SourceWS.UsedRange
'复制源工作表的内容到合并结果工作表
.Copy Destination:=DestWS.Cells(DestWS.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)
'处理合并单元格
For Each MergedArea In .MergeCells.Areas
'确定合并区域的范围
Set RangeToCopy = MergedArea
LastRow = DestWS.Cells(DestWS.Rows.Count, 1).End(xlUp).Row + 1
LastColumn = DestWS.Cells(LastRow, DestWS.Columns.Count).End(xlToLeft).Column + 1
'展开合并单元格并复制到合并结果工作表
RangeToCopy.Copy Destination:=DestWS.Cells(LastRow, LastColumn)
'取消合并单元格,并清除格式
RangeToCopy.MergeCells = False
DestWS.Cells(LastRow, LastColumn).ClearFormats
Next MergedArea
End With
End If
Next SourceWS
'恢复屏幕更新,并选中合并结果工作表
Application.ScreenUpdating = True
DestWS.Select
End Sub
请将此代码复制到 VBA 编辑器中的模块中,并运行它即可实现将多张带有合并单元格的表合并到一张表上。在运行之前,请确保您保存了所有要合并的源工作表。
希望对您有所帮助!如果您有其他问题,请随时提问。