编写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 编辑器中的模块中,并运行它即可实现将多张带有合并单元格的表合并到一张表上。在运行之前,请确保您保存了所有要合并的源工作表。 希望对您有所帮助!如果您有其他问题,请随时提问。