USE [FTIR2017]
GO
/****** Object: StoredProcedure [dbo].[Import_OrginalData] Script Date: 2018/8/4 15:45:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/**
关键1:避免无当日数据和表格信息,而导致数据综合导入的中断
-- 判定当前的数据库是否有存在对应的表格信息
IF EXISTS (SELECT * FROM dbo.SysObjects WHERE ID = object_id(N'[Opera_Main]') AND OBJECTPROPERTY(ID, 'IsTable') = 1)
PRINT '存在'
ELSE
PRINT'不存在'
**/
ALTER proc [dbo].[Import_OrginalData]
@startTime datetime,
@endTime datetime,
@Base_StationInfo_ID int, -- 站房ID
@Base_InstrumentInfo_ID int -- 设备ID
AS
BEGIN
DECLARE
@startYearInt int, --起始年
@startMonthInt int, --起始月
@startDayInt int, --起始日
@endYearInt int, --截止年
@sendMonthInt int, --截止月
@endDayInt int, --截止日
@difftime int, --时间差
@tabName varchar(255), --变量表名,即日原始数据表名
@insertOrginalDataSql nvarchar(4000), --插入语句(日数据列插入因子名称表中)
@updateNullSQL nvarchar(200), --更新语句
@insertSrt nvarchar(2000), -- 插入列
@fromStr nvarchar(2000), -- 来源列
@columnName varchar(255) --列名
;
--1.将输入的起始及截止参数,补加到对应12点
SELECT @startTime = DATEADD(HOUR,12,@startTime);
SELECT @endTime = DATEADD(HOUR,12,@endTime);
--2.判断对应日数据范围的表名
SELECT @difftime = DATEDIFF(DAY,@startTime,@endTime);
IF @difftime>=1
BEGIN
Declare @subTemp int=0,
@updateSQL nvarchar(2000);
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 @tabName = 'CMC'+CAST(@startYearInt as varchar);
IF @startMonthInt>0 and @startMonthInt<10
BEGIN
SET @tabName=@tabName+'0'+CAST(@startMonthInt as varchar);
END
ELSE
BEGIN
SET @tabName=@tabName+CAST(@startMonthInt as varchar);
END
IF @startDayInt>0 and @startDayInt<10
BEGIN
SET @tabName=@tabName+'0'+CAST(@startDayInt as varchar);
END
ELSE
BEGIN
SET @tabName=@tabName+CAST(@startDayInt as varchar);
END
-- 将对应的符合要求的表格数据导入对应的原始数据中
-- 验证对应的数据库是否有对应的表存在
IF EXISTS (SELECT * FROM dbo.SysObjects WHERE ID = object_id(N'['+@tabName+']') AND OBJECTPROPERTY(ID, 'IsTable') = 1)
BEGIN
-- 字符数据初始化
SET @insertSrt = '';
SET @fromStr = '';
-- 获取对应的表名称
DECLARE buildColumn CURSOR FOR
SELECT name from syscolumns where id=object_id(N'['+@tabName+']');
--打开游标
OPEN buildColumn
--循环游标
FETCH NEXT FROM buildColumn INTO @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
IF @columnName='?Count' --奇葩错误,原因不知
BEGIN
SET @fromStr = @fromStr
END
ELSE IF @columnName='Count' or @columnName='DateTime'
BEGIN
SET @fromStr = @fromStr+'['+@columnName+'],';
END
ELSE
BEGIN
SET @fromStr = @fromStr+'CAST(['+@columnName+'] as numeric(10,5)),';
-- 数据质量修复:对为空的数据进行替换,将其替换为null,避免数据由字符串转换为数值时引起异常
SET @updateNullSQL = 'UPDATE ['+@tabName+'] SET ['+@columnName+']=NULL WHERE ISNUMERIC(['+@columnName+'])=0';
EXEC(@updateNullSQL);
END
IF @columnName='?Count' --奇葩错误,原因不知
BEGIN
SET @insertSrt = @insertSrt
END
ELSE
BEGIN
SET @insertSrt = @insertSrt+'['+@columnName+'],';
END
insert into OriginalData_Names values(@tabName,@columnName,@Base_StationInfo_ID,@Base_InstrumentInfo_ID,null,null,null,null,null,null,null,null,null);
--得到下一条记录
FETCH NEXT FROM buildColumn INTO @columnName
END
--关闭并释放游标占有的资源
CLOSE buildColumn
DEALLOCATE buildColumn
-- 去掉字符的最后一位逗号 select00 left(@str,len(@str)-1)
SELECT @insertSrt = LEFT(@insertSrt,LEN(@insertSrt)-1);
SELECT @fromStr = LEFT(@fromStr,LEN(@fromStr)-1);
-- 拼接对应的执行语句:核心的数据插入语句
SET @insertOrginalDataSql = 'INSERT INTO Storage_FTIR_OriginalData_Temp([id],[Base_StationInfo_ID],[Base_InstrumentInfo_ID],[status],'+@insertSrt+') SELECT NEWID(),@BaseStationInfoID,@BaseInstrumentInfoID,0,'+@fromStr+' FROM ['+@tabName+']';
EXEC sp_executesql
@stmt = @insertOrginalDataSql,
@params = N'@BaseStationInfoID AS int,@BaseInstrumentInfoID AS int',
@BaseStationInfoID = @Base_StationInfo_ID,
@BaseInstrumentInfoID = @Base_InstrumentInfo_ID
-- 数据转移完成后,进行对应的原始数据表的清理工作
-- 将原有的数据进行表格删除操作
-- 为避免需要重复的进行数据插入操作的导入工作,特将此删除工作先行屏蔽掉
DELETE OriginalData_Names WHERE colName in('Count','DateTime','?Count');
EXEC('Drop Table ['+@tabName+']');
END
SET @subTemp = @subTemp+1;
END --WHILE结束
END --IF结束
-- 将刚导入的数据转移进入未修约的原始数据表中存储,便于数据错误后需要重新导出,可重复使用
INSERT INTO Storage_FTIR_OriginalData_NoFix SELECT * FROM Storage_FTIR_OriginalData_Temp sfod where sfod.Base_StationInfo_ID=@Base_StationInfo_ID and sfod.Base_InstrumentInfo_ID=@Base_InstrumentInfo_ID and sfod.DateTime>=@startTime and sfod.DateTime<=@endTime ORDER BY DateTime ASC;
UPDATE OriginalData_Names SET realName=lib.name,number=lib.number,code=lib.Code,Mtype=lib.Mtype,casno=lib.casno,alarmValue=lib.alarmValue,main=lib.main,secondary=lib.secondary,Charc=lib.Charc FROM Base_LibraryMonitor_Temp lib WHERE lib.gasId=CAST(colName as int) and OriginalData_Names.Base_StationInfo_ID = @Base_StationInfo_ID and OriginalData_Names.Base_InstrumentInfo_ID = @Base_InstrumentInfo_ID;
PRINT '原始数据导入完毕';
DELETE Storage_FTIR_OriginalData_Temp WHERE DateTime<=@startTime or DateTime>=@endTime;
END
SQL server实战篇(七)
猜你喜欢
转载自blog.csdn.net/qq_39001049/article/details/81411798
今日推荐
周排行