SQL server实战篇(七)

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

猜你喜欢

转载自blog.csdn.net/qq_39001049/article/details/81411798