首页 > 其他分享 >西门子Wincc的归档数据批量导出2

西门子Wincc的归档数据批量导出2

时间:2022-12-04 12:48:05浏览次数:45  
标签:SET varchar temp -- 归档 西门子 REPLACE Wincc sql

TagLoggingExport.sql脚本如下:

USE [CC_oval_21_10_27_09_20_33R] 
GO

--存储过程如果存在,则先删除存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_TagLoggingExportDay]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_TagLoggingExportDay]
GO

CREATE PROCEDURE [dbo].[sp_TagLoggingExportDay]
    @TableName varchar(50),            --解密表名称
    @DatabaseName varchar(50),        --解密数据库名称
    @DatabasePath varchar(50),        --解密数据库文件存储路径
    @BackupName varchar(50),        --备份文件的名称
    @BackupPath varchar(50),        --备份文件的路径
    @SelectDate varchar(50),        --查询的日期,如为空,则查询前一天,格式为2021-10-26
    @ArchiveTagName varchar(max)    --查询的变量名不能包含中文,可以为ValueID或者TagName,以;分隔,变量不能超出20,如果是TagName则字符长度不能超出128,如1;2;3或者Archvie1/tag1;Archive1/tag2
AS
BEGIN
    declare @sql nvarchar(max)
    declare @CurDate varchar(50)    --备份数据库日期后缀

    declare @StartTime varchar(50)    --查询开始时间
    declare @EndTime varchar(50)    --查询结束时间

    declare @Count int                --查询valudid数量,20个为一批
    declare @TagName nvarchar(50)    --存储ValueID对应的TagName,用于去掉Energy
    declare @temp nvarchar(max)

    --数据库不存在,则先创建数据库
    IF (NOT EXISTS (SELECT * FROM sys.databases WHERE name = @DatabaseName))
    BEGIN
        SET @sql = N'CREATE DATABASE <NAME> ON (NAME= ''<NAME>'',FILENAME= ''<PATH>\<NAME>.mdf'',SIZE=5mb,MAXSIZE=unlimited,FILEGROWTH=10%)'
        SET @sql = REPLACE(@sql, '<NAME>', @DatabaseName)
        SET @sql = REPLACE(@sql, '<PATH>', @DatabasePath)
        exec(@sql)
    END

    --Archive表存在,先删除
    SET @sql = N'[<DataBaseName>].[dbo].[Archive]'
    SET @sql = REPLACE(@sql, '<DataBaseName>', @DatabaseName)

    IF OBJECT_ID(@sql,N'u') iS NOT NULL
        BEGIN
            SET @sql = 'DROP TABLE [<DataBaseName>].[dbo].[Archive]'
            SET @sql = REPLACE(@sql, '<DataBaseName>', @DatabaseName)
            exec(@sql)
        END

    --插入Archive到数据库,方便ValueID与ValueName的关联
    SET @sql = 'Select * into [<DataBaseName>].[dbo].[Archive] FROM [Archive]'
    SET @sql = REPLACE(@sql, '<DataBaseName>', @DatabaseName)
    exec(@sql)

    --表不存在,则先创建表
    SET @sql = N'[<DataBaseName>].[dbo].[<TableName>]'
    SET @sql = REPLACE(@sql, '<DataBaseName>', @DatabaseName)
    SET @sql = REPLACE(@sql, '<TableName>', @TableName)

    IF OBJECT_ID(@sql,N'u') iS NULL            --表不存在,先创建表
        BEGIN
            SET @sql = 'CREATE TABLE [<DATABASENAME>].[dbo].[<TABLENAME>](
                [ValueID] [int] NOT NULL,
                [Timestamp] [datetime] NOT NULL,
                [RealValue] [float] NOT NULL,
                [Quality] [int] NOT NULL,
                [Flags] [int] NOT NULL
                )'
            SET @sql = REPLACE(@sql, '<DATABASENAME>', @DatabaseName)
            SET @sql = REPLACE(@sql, '<TABLENAME>', @TableName)
            exec(@sql)
        END
    ELSE                                    --表存在,删除所有数据
        BEGIN
            SET @sql = 'DELETE FROM [<DATABASENAME>].[dbo].[<TABLENAME>]'
            SET @sql = REPLACE(@sql, '<DataBaseName>', @DatabaseName)
            SET @sql = REPLACE(@sql, '<TableName>', @TableName)
            exec(@sql)
        END

    --时间处理
    IF @SelectDate is NULL                    --参数为NULL,则查询前一天归档数据
        BEGIN
            --获取前一天日期时间
            SET @StartTime = CONVERT(varchar(100), DATEADD(DAY, -1, GETDATE()),23) + ' 00:00:00.000'
            SET @EndTime = CONVERT(varchar(100), DATEADD(DAY, -1, GETDATE()),23) + ' 23:59:59.999'
            --变量记录时间为UTC,需减8小时
            SET @StartTime = CONVERT(varchar(100),DATEADD(HOUR, -8, @StartTime), 25)
            SET @EndTime = CONVERT(varchar(100),DATEADD(HOUR, -8, @EndTime), 25)

            SET @CurDate = CONVERT(varchar(100), DATEADD(DAY,-1, GETDATE()),112)
        END
    ELSE
        IF @SelectDate = '0000-00-00'        --参数为0000-00-00,则查询前10分钟数据,用于测试
            BEGIN
                SET @StartTime = '0000-00-00 00:10:00.000'
                SET @EndTime = '0000-00-00 00:00:00.000'
                SET @CurDate = CONVERT(varchar(100), DATEADD(MINUTE,-10, GETDATE()),112) + REPLACE(CONVERT(varchar(100), DATEADD(MINUTE,-10, GETDATE()),108),':','')
            END
        ELSE                                --参数为实际日期时间,则查询指定日期归档数据
            BEGIN
                SET @StartTime = @SelectDate + ' 00:00:00.000'
                SET @EndTime = @SelectDate + ' 23:59:59.999'
                --变量记录时间为UTC,需减8小时
                SET @StartTime = CONVERT(varchar(100),DATEADD(HOUR, -8, @StartTime), 25)
                SET @EndTime = CONVERT(varchar(100),DATEADD(HOUR, -8, @EndTime), 25)

                SET @CurDate = REPLACE(@SelectDate, '-' ,'')
            END

    IF UPPER(@ArchiveTagName) = 'ALL'        --查询Archive表中的所有归档数据
        BEGIN
            SET @Count = 0
            SET @ArchiveTagName = ''

            DECLARE RS CURSOR FOR
            SELECT ValueID FROM [Archive]

            OPEN RS
            FETCH NEXT FROM RS INTO @temp
            WHILE @@Fetch_Status = 0
                BEGIN
                    SELECT @TagName = ValueName FROM [Archive] Where ValueID = @temp
                    --如ValueName包含Energy,则略过
                    IF CHARINDEX('Energy', @TagName) = 0
                        BEGIN
                            SET @Count = @Count + 1
                            IF @Count = 20
                                BEGIN
                                    SET @ArchiveTagName = @ArchiveTagName + ';' + @temp

                                    Set @sql = 'Insert Into <database>.[dbo].<tableName> Select * from OpenQuery(WINCCOLEDB,N''Tag:R,(<tagName>),''''<startTime>'''',''''<endTime>'''''')'
                                    SET @sql = REPLACE(@sql, '<database>', @DatabaseName)
                                    SET @sql = REPLACE(@sql, '<tableName>', @TableName)
                                    SET @sql = REPLACE(@sql, '<tagName>', @ArchiveTagName)
                                    SET @sql = REPLACE(@sql, '<startTime>', @StartTime)
                                    SET @sql = REPLACE(@sql, '<endTime>', @EndTime)
                                    print('SQL:' + @sql)
                                    exec( @sql)
                                    --PRINT @ArchiveTagName
                                    SET @Count = 0
                                    SET @ArchiveTagName = ''
                                END
                            ELSE
                                BEGIN
                                    IF @ArchiveTagName = ''
                                        BEGIN
                                            SET @ArchiveTagName = @temp
                                        END
                                    ELSE
                                        BEGIN
                                            SET @ArchiveTagName = @ArchiveTagName + ';' + @temp
                                        END
                                END
                        END
                    FETCH NEXT FROM RS INTO @temp
                END
            CLOSE RS
            DEALLOCATE RS

            --处理剩余Tag
            IF @Count <> 0
                BEGIN
                    Set @sql = 'Insert Into <database>.[dbo].<tableName> Select * from OpenQuery(WINCCOLEDB,''Tag:R,(<tagName>),''''<startTime>'''',''''<endTime>'''''')'
                    SET @sql = REPLACE(@sql, '<database>', @DatabaseName)
                    SET @sql = REPLACE(@sql, '<tableName>', @TableName)
                    SET @sql = REPLACE(@sql, '<tagName>', @ArchiveTagName)
                    SET @sql = REPLACE(@sql, '<startTime>', @StartTime)
                    SET @sql = REPLACE(@sql, '<endTime>', @EndTime)
                    print('SQL:' + @sql)
                END
        END
    ELSE                                    --查询指定ValueID或者ValueName
        BEGIN
            Set @sql = 'Insert Into <database>.[dbo].<tableName> Select * from OpenQuery(WINCCOLEDB,''Tag:R,(<tagName>),''''<startTime>'''',''''<endTime>'''''')'
            SET @sql = REPLACE(@sql, '<database>', @DatabaseName)
            SET @sql = REPLACE(@sql, '<tableName>', @TableName)
            SET @sql = REPLACE(@sql, '<tagName>', @ArchiveTagName)
            SET @sql = REPLACE(@sql, '<startTime>', @StartTime)
            SET @sql = REPLACE(@sql, '<endTime>', @EndTime)
            print('SQL:' + @sql)
            exec( @sql)
        END

    --备份数据库
    SET @sql = 'BACKUP DATABASE <DATABASE> TO DISK = ''<PATH>\<NAME><DATE>.bak'' WITH INIT'
    SET @sql = REPLACE(@sql,'<DATABASE>', @DatabaseName)
    SET @sql = REPLACE(@sql,'<PATH>', @BackupPath)
    SET @sql = REPLACE(@sql,'<NAME>', @BackupName)
    SET @sql = REPLACE(@sql,'<DATE>', @CurDate)
    exec(@sql)
    print @sql
END

GO


--示例1:导出前一天编号为893/894/895;896;897的归档数据,存储在c:\temp\database数据库TagLoggingDecode中的data表中,并备份到C:\temp\database\backup文件夹
--EXEC sp_TagLoggingExportDay 'data','TagLoggingDecode','c:\temp\database','893;894;895;896;897',null,'TagLogging','c:\temp\database\backup'

--示例2:导出前10分钟编号为893/894/895;896;897的归档数据,存储在c:\temp\database数据库TagLoggingDecode中的data表中,并备份到C:\temp\database\backup文件夹
--EXEC sp_TagLoggingExportDay 'data','TagLoggingDecode','c:\temp\database','893;894;895;896;897','0000-00-00','TagLogging','c:\temp\database\backup'

--示例3:导出前一天所有归档的归档数据,存储在c:\temp\database数据库TagLoggingDecode中的data表中,并备份到C:\temp\database\backup文件夹
--EXEC sp_TagLoggingExportDay 'data','TagLoggingDecode','c:\temp\database','ALL',null,'TagLogging','c:\temp\database\backup'

--示例4:导出2021年10月11日的所有归档数据,存储在c:\temp\database数据库TagLoggingDecode中的data表中,并备份到C:\temp\database\backup文件夹
--EXEC sp_TagLoggingExportDay 'data','TagLoggingDecode','c:\temp\database','ALL','2021-10-11','TagLogging','c:\temp\database\backup'

 

标签:SET,varchar,temp,--,归档,西门子,REPLACE,Wincc,sql
From: https://www.cnblogs.com/caesar-the-great/p/16949654.html

相关文章

  • 西门子Wincc的归档数据批量导出
    目录1.LinkedServer1).登录SqlServerManagementStudio2).添加LinkedServer2.存储过程1).修改SQL脚本2).运行SQL脚本3).测试存储过程(a).存储过程说明......
  • 20221203 Docker - 拉勾教育【归档】
    参考资料拉勾教育尚硅谷Docker【归档】Docker官网Docker官网文档命令参考-Docker官网DockerHub前言背景2020年学习了一套尚硅谷的Docker视......
  • 西门子Step7 Smart软件下载
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【0023】即可获取下载链接。......
  • 西门子博图V15.1下载
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【0022】即可获取下载链接。......
  • 西门子S7-200PLC工具软件,包含200系列编程软件、PPI驱动、密码识别工具
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【0026】即可获取下载链接。......
  • Oracle数据库体系结构更改数据库的归档模式
    重做日志文件负责实例失败时的数据恢复,因为SGA中没有被保存的数据会全部丢失,使用重做日志文件就可以完全恢复事务。而归档日志进程用于介质恢复,比如磁盘损坏时,可以使用之前......
  • outlook与foxmail邮箱归档
    微软操作https://support.microsoft.com/zh-cn/office/%E6%89%8B%E5%8A%A8%E5%B0%86%E9%A1%B9%E7%9B%AE%E5%AD%98%E6%A1%A3-ecf54f37-14d7-4ee3-a830-46a5c33274f6  ......
  • Linux系统中的文件归档压缩
    一、文件压缩及归档1、文件压缩gzip和bzip命令用于文件压缩,但是缺陷是压缩完成后源文件消失所以一般不用。命令格式是:gzip或者bzip+0-9的压缩等级(数字越大压缩级别越大)......
  • Oracle归档
    Oracle归档1.开启归档1.1查看归档状态使用以下命令查看归档状态SQL>ARCHIVELOGLIST;DatabaselogmodeNoArchiveModeAutomaticarchival......
  • 20221129 Maven - 尚硅谷【归档】
    参考资料尚硅谷2022版Maven教程(maven入门+高深,全网无出其右!)Maven官网POM参考mvnrepository代码重工前言视频时间:2022-2版本信息当前最新版本:3.8......