获取SQL Server中新记录插入的范围

时间:2016-12-28 04:24:29

标签: sql-server triggers

我已将数据从下游发送到云服务,它将插入到Cloud SQL Services。

但是,目前数据每秒发送最多12个数据几个小时。数据包含DeviceIDTimestampHexData等,并将保存在tbl_highspeeddata中。已创建触发器以将此表上的十六进制数据值转换为ASCII字符串。

如果数据以某种间隔进入,则转换效果很好。至于现在,只有更少的十六进制数据被转换,因为我目前停留在如何使它从最后一次获取直到最新插入的新行的选择范围,并在更新之前逐个转换回列。

完成后,它将从上一次最后处理数据之后的第一个新数据开始,直到最新插入的记录并重复转换。

我尝试了INSTEAD OF触发器

SELECT TOP n [primaryKey], * 
FROM table 
ORDER BY [primaryKey] DESC

SELECT SCOPE_IDENTITY();

并且都无法转换和更新每个插入的行。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[HSHD_Data_Conversion] 
ON [dbo].[HSHD]
AFTER INSERT
AS
BEGIN
    /****** HSHD stand for High Speed Hex Data ******/
    ---------convert HEX to ASCII
    DECLARE @ID      INT
    DECLARE @HEX      VARCHAR(MAX)

    SET @ID = (SELECT SCOPE_IDENTITY()) --(SELECT TOP 1 ID from HSHD ORDER BY DateCreated DESC)
    SET @HEX = (select CONVERT(varbinary(max), Data, 2) from HSHD WHERE ID = @ID)

    UPDATE HSHD 
    SET Data = @HEX 
    WHERE ID = @ID

    ---------split command, query and result    
    DECLARE @Delimiter      VARCHAR(8000)
    DECLARE @Item           VARCHAR(8000)
    DECLARE @ItemList       VARCHAR(8000)
    DECLARE @DelimIndex     INT
    DECLARE @RowID          INT
    DECLARE @counter        INT 
    DECLARE @isQuery        VARCHAR(1)

    SET @RowID = (SELECT SCOPE_IDENTITY()) --(SELECT TOP 1 ID FROM HSHD ORDER BY ID DESC)
    SET @ItemList = (SELECT Data FROM HSHD WHERE ID = @RowID)
    SET @counter = 0
    SET @Delimiter = ':'
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)

    WHILE (@DelimIndex != 0)
    BEGIN           
        SET @counter = @counter + 1
        SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)

        --ignore the first element
        IF @counter != 1
        BEGIN
            SET @isQuery = CHARINDEX('?',@Item,0)

            IF len(@Item) != 0
            BEGIN
                IF @isQuery != 0
                BEGIN
                    INSERT INTO HSHD_Data(HSHD,Query) VALUES (@RowID,':' + @Item)
                END
                ELSE INSERT INTO HSHD_Data(HSHD,Command) VALUES (@RowID, ':' + @Item)
            END     
        END

        -- Set @ItemList = @ItemList minus one less item
        SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
        SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
        SET @counter = @counter + 1
    END -- End WHILE

    IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
    BEGIN
        SET @Item = @ItemList
        SET @isQuery = CHARINDEX('?',@Item,0)

            IF len(@Item) != 0
            BEGIN
                IF @isQuery != 0
                BEGIN
                    INSERT INTO HSHD_Data(HSHD,Query) VALUES (@RowID,':' + @Item)
                END
                ELSE INSERT INTO HSHD_Data(HSHD,Command) VALUES (@RowID, ':' + @Item)
            END     
    END

    ELSE 
    BEGIN 
        SET @isQuery = CHARINDEX('?',@ItemList,0)
        IF @isQuery != 0
            INSERT INTO HSHD_Data(HSHD,Query) VALUES (@RowID, @ItemList)
        ELSE 
            INSERT INTO HSHD_Data(HSHD,Result) VALUES (@RowID, @ItemList)
    END
END

我的参考:

Instead Of

Newly Added Row

编辑:

触发运行前的HSHD数据:

enter image description here

触发后运行的HSHD数据:

enter image description here

因此,在触发器完成运行并转换这两个数据后,触发器将开始抓取:SYSTem:ERRor! #STRing之后的数据,直到最后一个转换后的十六进制并将ASCII值更新回HEX数据。

0 个答案:

没有答案