SELECT name FROM sys.tables WHERE name LIKE'DOP_%'
2、怎么逐个拿到表名进行分别查询?
• 用游标循环
-- 声明游标查询符合条件的表 DECLARE@MyCursorCURSOR; SET@MyCursor=CURSORFOR SELECT name FROM sys.tables WHERE name LIKE'DOP_%'; OPEN@MyCursor; FETCH NEXT FROM@MyCursorINTO@tablename; WHILE @@FETCH_STATUS=0 BEGIN PRINT '正在处理表:'+@tablename; FETCH NEXT FROM@MyCursorINTO@tablename; END; CLOSE@MyCursor; DEALLOCATE@MyCursor;
3、怎么把字符串表名转为数据库能知道的表?
• 使用 QUOTENAME(@tablename)
4、怎么执行动态SQL,动态拼接参数?
• 使用 EXEC sp_executesql
5、怎么将单个设备的查询结果存入结果集?
• 先定义好结果表结构
DECLARE@resTableTABLE ( deviceNumber nvarchar(200), dop int );
-- 获取上一条 SQL 影响的行数 SET@rowCount= @@ROWCOUNT; -- 2. 若时间范围内无数据,插入默认记录0 IF @rowCount=0 BEGIN SET@sql= N' SELECT TOP 1 device_number AS deviceNumber, 0 AS dop FROM '+ QUOTENAME(@tablename); INSERT INTO@resTable EXEC sp_executesql @sql; END
7、为了增强存储过程的查询灵活性,把查询时间设置为入参?
ALTERPROCEDURE [dbo].[procDeviceDOPList] @startTime datetime, -- 改为 datetime 类型(或 datetime2) @endTime datetime -- 改为 datetime 类型 AS BEGIN
END
8、怎么结合Mybatis-Plus调用存储过程?
// Mapper层 List<DeviceDOPItemDTO> selectDeviceDOPList(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
DECLARE@MyCursorCURSOR; SET@MyCursor=CURSORFOR SELECT name FROM sys.tables WHERE name LIKE'DOP_%';
OPEN@MyCursor;
FETCH NEXT FROM@MyCursorINTO@tablename; WHILE @@FETCH_STATUS=0 BEGIN -- 1. 查询时间范围内的数据,使用参数化传递时间 SET@sql= N' SELECT device_number AS deviceNumber, SUM(output_diff) AS dop FROM '+ QUOTENAME(@tablename) + N' WHERE createdate >= @p_startTime AND createdate <= @p_endTime GROUP BY device_number';