USE [FTIR2017]
GO
/* Object: StoredProcedure [dbo].[Data_Ftir_ZeroFix] Script Date: 2018/8/4 15:51:55 */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
– exec Data_Ftir_ZeroFix ‘2018-04-12’,’2018-04-19’,3,2
/**
进行对应的零值修复操作
**/
ALTER proc [dbo].[Data_Ftir_ZeroFix]
@startTime datetime,
@endTime datetime,
@Base_StationInfo_ID int, – 站房ID
@Base_InstrumentInfo_ID int – 设备ID
AS
BEGIN
Declare
@columnName nvarchar(30), -- 列名
@updateSQL nvarchar(2000), -- 更新语句
@difftime int, -- 时间差(天):用于获取对应因子范围的中间变量
@tableName nvarchar(max), -- 表名集合
@startYearInt int, -- 起始年
@startMonthInt int, -- 起始月
@startDayInt int, -- 起始日
@endYearInt int, -- 截止年
@sendMonthInt int, -- 截止月
@endDayInt int, -- 截止日
@selectSQL nvarchar(max) -- 查询赋值语句
;
SELECT @difftime = DATEDIFF(DAY,@startTime,@endTime);
SET @tableName = '''';
SELECT @startTime = DATEADD(HOUR,12,@startTime);
SELECT @endTime = DATEADD(HOUR,12,@endTime);
Declare @subTemp int=0
WHILE @subTemp<=@difftime
BEGIN
--时间界定
SELECT @startYearInt=DATEPART(YEAR,DATEADD(day,@subTemp,@startTime));
SELECT @startMonthInt=DATEPART(MONTH,DATEADD(day,@subTemp,@startTime));
SELECT @startDayInt=DATEPART(DAY,DATEADD(day,@subTemp,@startTime));
SET @tableName = @tableName+'CMC'+CAST(@startYearInt as varchar);
IF @startMonthInt>0 and @startMonthInt<10
BEGIN
SET @tableName = @tableName+'0'+CAST(@startMonthInt as varchar);
END
ELSE
BEGIN
SET @tableName = @tableName+CAST(@startMonthInt as varchar);
END
IF @startDayInt>0 and @startDayInt<10
BEGIN
SET @tableName = @tableName+'0'+CAST(@startDayInt as varchar);
END
ELSE
BEGIN
SET @tableName = @tableName+CAST(@startDayInt as varchar);
END
SET @tableName = @tableName+''',''';
SET @subTemp = @subTemp+1;
END
-- 去掉字符的最后一位逗号 select00 left(@str,len(@str)-1)
SET @tableName = LEFT(@tableName,LEN(@tableName)-2);
SET @selectSQL = 'INSERT INTO CurrentColumnNames SELECT NEWID(),colName,@inStationID,@inInstrumentID FROM OriginalData_Names WHERE Base_StationInfo_ID=@inStationID AND Base_InstrumentInfo_ID=@inInstrumentID AND tableName IN('+@tableName+') GROUP BY colName';
EXEC sp_executesql
@stmt = @selectSQL,
@params = N'@inStationID as int,@inInstrumentID as int',
@inStationID = @Base_StationInfo_ID,
@inInstrumentID = @Base_InstrumentInfo_ID;
DELETE CurrentColumnNames WHERE columnName in('Count','DateTime');
-- 进行逐列的数据零值修复
DECLARE Cur_Ftir_ZeroFix CURSOR FOR
-- 列名全查 SELECT name from syscolumns where id=object_id(N'[Storage_FTIR_OriginalData]');
SELECT columnName FROM CurrentColumnNames order by CAST(columnName AS int);
--打开游标
OPEN Cur_Ftir_ZeroFix
--循环游标
FETCH NEXT FROM Cur_Ftir_ZeroFix INTO @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
-- 初始化更新语句
SET @updateSQL = '';
SET @updateSQL = 'Update Storage_FTIR_OriginalData_Temp SET ['+@columnName+'] =(m.lowest * 0.5) FROM Base_LibraryMonitor m WHERE m.gasId=@gasid and Base_StationInfo_ID=@stationID and Base_InstrumentInfo_ID = @InstrumentID and DateTime>@sTime and DateTime <=@eTime and ['+@columnName+']=0';
EXEC sp_executesql
@stmt = @updateSQL,
@params = N'@gasid AS int,@stationID AS int,@InstrumentID AS int,@sTime AS datetime,@eTime AS datetime',
@gasid = @columnName,
@stationID = @Base_StationInfo_ID,
@InstrumentID = @Base_InstrumentInfo_ID,
@sTime = @startTime,
@eTime = @endTime
;
-- 加入判定条件,若对应物质的监测值小于其检定下限的,即比标准的补数还要低的,则将其修改为-1,且不允许其进行计算
SET @updateSQL = '';
SET @updateSQL = 'Update Storage_FTIR_OriginalData_Temp SET ['+@columnName+'] =-1 FROM Base_LibraryMonitor m WHERE m.gasId=@gasid and Base_StationInfo_ID=@stationID and Base_InstrumentInfo_ID = @InstrumentID and DateTime>@sTime and DateTime <=@eTime and ['+@columnName+']<(m.lowest)';
EXEC sp_executesql
@stmt = @updateSQL,
@params = N'@gasid AS int,@stationID AS int,@InstrumentID AS int,@sTime AS datetime,@eTime AS datetime',
@gasid = @columnName,
@stationID = @Base_StationInfo_ID,
@InstrumentID = @Base_InstrumentInfo_ID,
@sTime = @startTime,
@eTime = @endTime
;
--得到下一条记录
FETCH NEXT FROM Cur_Ftir_ZeroFix INTO @columnName
END
--关闭并释放游标占有的资源
CLOSE Cur_Ftir_ZeroFix
DEALLOCATE Cur_Ftir_ZeroFix
-- 清理当前列名保存表信息
DELETE CurrentColumnNames;
PRINT '零值处理完毕';
END