我已将数据从下游发送到云服务,它将插入到Cloud SQL Services。
但是,目前数据每秒发送最多12个数据几个小时。数据包含DeviceID
,Timestamp
,HexData
等,并将保存在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
我的参考:
编辑:
触发运行前的HSHD数据:
触发后运行的HSHD数据:
因此,在触发器完成运行并转换这两个数据后,触发器将开始抓取:SYSTem:ERRor! #STRing
之后的数据,直到最后一个转换后的十六进制并将ASCII值更新回HEX数据。