Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- USE [TBI_HRS]
- GO
- /****** Object: Trigger [dbo].[TRI_INS_leave_Maill_Log] Script Date: 2018/3/13 下午 05:55:28 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- /* 重要!!! 撰寫 TRIGGER 時要注意事項 https://dotblogs.com.tw/jamesfu/2014/06/20/triggersample */
- ALTER TRIGGER [dbo].[TRI_INS_leave_Maill_Log] ON [dbo].[leave_Maill_Log]
- AFTER INSERT
- AS
- /*不會多增加一筆資料
- 停止在部分結果集中傳回顯示 Transact-SQL 陳述式或預存程序所影響之資料列數的訊息。
- 當 SET NOCOUNT 是 ON 時,不會傳回計數。 當 SET NOCOUNT 是 OFF 時,會傳回計數。
- @@ROWCOUNT函式會更新,即使 SET NOCOUNT 是 ON。
- SET NOCOUNT ON 會防止針對預存程序中的每個陳述式,將 DONE_IN_PROC 訊息傳給用戶端。
- 針對包含數個陳述式 (不會傳回許多實際資料的陳述式) 的預存程序或是包含 Transact-SQL 迴圈的程序
- ,將 SET NOCOUNT 設為 ON 可以大幅提升效能,因為網路傳輸量會大幅降低。*/
- /* 參考網址 https://docs.microsoft.com/zh-tw/sql/t-sql/statements/set-nocount-transact-sql */
- SET NOCOUNT ON;
- /*============================================創造變數區=======================================================*/
- DECLARE @y nvarchar(20),/*年*/
- @m nvarchar(20),/*月*/
- @d nvarchar(20),/*日*/
- @current int,/*目前 (今天) 第幾筆*/
- @result nvarchar(30),/*最後輸出結果 ex: LM1803130001 */
- @water int /*目前 Insert 這筆的流水編號*/
- /* 暫存 Table
- 在記憶體宣告建立
- 批次作業結束後清除
- 另外一種是在 tempdb 中建立
- ex:I.區域-前置詞#-其他連線不可查詢此TABLE
- II.全域-前置詞##-其他連線可查詢此TABLE
- 連線中斷後被清除
- */
- /* 參考網址 http://deanma.blogspot.tw/2012/01/ms-sql-temp-table.html */
- DECLARE @NOM_tmp TABLE (ROWID int,ID int )
- DECLARE @WhileTableCount int,
- @TabelCount int
- /*============================================創造變數區=======================================================*/
- /* inserted 目前新增的所有資料
- 將目前新增的所有資料存到 暫存表(@NOM_tmo) 中
- 並且使用 ROW_NUMBER 函式 來增加排序編號(ex:1、2、3....) 名稱叫做 ROWID
- ROWID 會用來當作 WHILE ( MSSQL 裡面代替 FOREACH) 當前變量
- Insert 時的資料從 select 裡面抓出來 https://www.w3schools.com/sql/sql_insert_into_select.asp
- */
- insert into @NOM_tmp select ROW_NUMBER() OVER(ORDER BY id) AS ROWID,ID from inserted
- /* @TabelCount 總數,類似 for 迴圈裡面 xx.count */
- SET @TabelCount = (SELECT COUNT(*) FROM @NOM_tmp)
- /* @@WhileTableCount 起始變數,這邊會以 1 當作初始值,要跟 ROWID 對應到 */
- SET @WhileTableCount=1
- select @y=SUBSTRING(CONVERT(nvarchar(50), Year(GETDATE())),3,2),
- @m=RIGHT('00'+CONVERT(nvarchar, Month(GETDATE())),2),
- @d=RIGHT('00'+CONVERT(nvarchar, Day(GETDATE())),2)
- /* 代替 FOR 迴圈 ( 類似C#裡面的 WHILE),CURRENT 變數值如果小於總數就會一直跑
- FOR 迴圈寫法參考 https://dotblogs.com.tw/mola/2012/04/25/71786
- #另外 盡量避免使用Cursor - https://dotblogs.com.tw/ricochen/archive/2010/11/09/19323.aspx
- */
- WHILE @WhileTableCount <= @TabelCount
- BEGIN /* BEGIN END 一個區塊的程式碼,沒有的話就是一行的程式碼 */
- /* 抓目前變數量(@WhileTableCount ex: 1、2、3....)
- 等於 ROWID 欄位 (上面多增加的排序編號)
- 在抓取唯一值流水編號
- */
- select @water=ID from @NOM_tmp where ROWID=@WhileTableCount
- /* 抓取目前最大數字,依照指定條件(ex: LM + 年 + 月 + 日 ) */
- select @current=Max(CONVERT(int, substring(M_num,9,4))) from leave_Maill_Log
- where m_num like 'LM'+@y+@m+@d+'%'
- IF @current is NUll
- begin
- select @current=1
- select @result=Right('0000'+Convert(nvarchar,@current),4)
- END
- ELSE
- begin
- select @current=@current+1
- select @result=Right('0000'+Convert(nvarchar,@current),4)
- END
- update leave_Maill_Log set M_num='LM'+@y+@m+@d+@result, CretateDate=GETDATE() where ID=@water
- --以下這句異常重要,忘記寫的話,SQL也是會跑無限迴圈的XD
- SET @WhileTableCount = @WhileTableCount + 1
- print 'test'
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement