daily pastebin goal
91%
SHARE
TWEET

Untitled

a guest Mar 13th, 2018 62 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top