Advertisement
Guest User

Untitled

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