1. 程式人生 > >SQL Server 2008 批量插入數據時觸發器腳本實例

SQL Server 2008 批量插入數據時觸發器腳本實例

ext 時間 最新 after 時長 HERE alt 說明 eal

--SQL Server 2008 批量插入數據時,觸發器腳本實例
ALTER TRIGGER [dbo].[T_Name]
   ON  [dbo].[HT_CurrentTagRecord]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    --INSERT
    BEGIN     
        declare @I_Code
nvarchar(20); declare @I_CreateTime datetime; declare @I_WorkState int; declare MyCursor cursor for SELECT Code, CreateTime, WorkState FROM INSERTED open MyCursor; fetch next from MyCursor into @I_Code, @I_CreateTime, @I_WorkState; --不判斷@I_CreateTime是否大於當前的StartTime了,因為批量發過來的數據中都是一個標簽一條數據
while @@fetch_status=0 --循環讀取 begin declare @Id int; declare @Code nvarchar(20); declare @StartTime datetime; declare @StopTime datetime; if(exists(SELECT 1 FROM DBName.dbo.StaticsTable S WHERE Code = @I_Code
)) begin SELECT top 1 @Id = Id, @Code = S.Code, @StartTime = S.StartTime, @StopTime = S.StopTime --查詢StaticsTable中最新的記錄 FROM DBName.dbo.StaticsTable S WHERE Code = @I_Code order by S.Id desc; --分析: --如果最新的記錄的終止統計時間(即StopTime)為空,說明該時間段設備還沒關機 --如果最新的記錄的終止統計時間(即StopTime)不為空,說明該時間段設備已關機 --如果是新增的記錄是 "關機" 數據記錄 if(@I_WorkState = 0) begin if(ISNULL(@StopTime,‘‘) = ‘‘) --如果最新的記錄的終止統計時間為空,說明該時間段的統計還沒結束,則讓其終止 begin update DBName.dbo.StaticsTable set StopTime=@I_CreateTime,UseMinuteTime = DATEDIFF(n, @StartTime, @I_CreateTime) where Id = @Id; end end else if(@I_WorkState = 1) --如果是新增的記錄是 "開機" 數據記錄 begin if(ISNULL(@StopTime,‘‘) = ‘‘) --如果最新的記錄的終止統計時間為空,說明該時間段的統計還沒結束,則刷新該記錄的使用時長 begin if(ISNULL(@StartTime,‘‘) = ‘‘) begin update DBName.dbo.StaticsTable set StartTime = @I_CreateTime, UseMinuteTime = 0 where Id = @Id; end else begin update DBName.dbo.StaticsTable set UseMinuteTime = DATEDIFF(n, @StartTime, @I_CreateTime) where Id = @Id; end end else --如果最新的記錄的終止時間不為空,表示該時間的統計已終止,則創建一條新的統計記錄 begin Insert into DBName.dbo.StaticsTable values(@I_Code, @I_CreateTime, null, 0); end end end else begin --如果StaticsTable表中未找到相應的記錄,則插入一條初始記錄 Insert into DBName.dbo.StaticsTable values(@I_Code, @I_CreateTime, null, 0); end fetch next from MyCursor into @I_Code, @I_CreateTime, @I_WorkState; end; close MyCursor; deallocate MyCursor; END END

SQL Server 2008 批量插入數據時觸發器腳本實例