2016年6月21日 星期二

[ SQL Server ] T-SQL 迴圈拆解後新增資料



[記錄]


需求:

當資料庫Table有一筆資料新增時,要將資料拆解後新增到另外一個Table。

產品生產出來會新增一筆資料(或是手動輸入),資料格式主要的幾個欄位是這樣

ID、Count、Width1、Width2、Width3、Width4.......Width12

Count代表有幾個產物,Width是個別的寬度

也就是說 Count =>5   Width1~Width5就會有資料,其他為0

然後要做的是在收到這筆資料資後 , 把5個產物拆成5筆資料新增到另外一個資料庫

因為對 SQL 寫法不太熟 ,就用最笨的方式做,但有些地方可能還是有問題




簡單來說就是這樣!!

Data_Table1 有一筆資料進來

ID Count Width1 Width2 Width3 Width4 .....
5 3 1 0 8 0 .....

Data_Table2 根據Count拆成多筆資料

ID Table1_ID Width .....
1 5 10 .....
2 5 8 .....
3 5 5 .....

寫成T-SQL後讓資料庫自己處理C#、VB的程式只要新增資料到Table1就可以

為什麼會這樣用呢?
這是做紙捲生產記錄資料時發生的狀況
紙捲生產完後,會再去做裁切變成小紙捲
而每次生產所裁切的小紙捲數也不一定
而原始的大紙捲會有一個生產編號
裁切完的小紙捲有是同用同一個生產標號
(假設裁切成5捲,這5捲生產標號是一樣的)
但這5捲又會有各自的出貨編號
所以才會出現這樣拆解的狀況






[做法紀錄]

1.建立觸發程序,當Table有資料新增的時候觸發

















2.編輯T-SQL



CREATE TRIGGER [dbo].[DoInser_PAPERROLL]
   ON  [dbo].[Winder_Data]
   For INSERT
AS

--[dbo].[DoInser_PAPERROLL]  這個觸發程序的名稱
--[dbo].[Winder_Data]  哪個Table發生事情執行
--For INSERT  在新增的時候觸發


--開始處理資料
BEGIN
SET NOCOUNT ON;
     
        --建立變數,暫存查詢到的資料
        DECLARE @ID varchar(15)
        DECLARE @Count char(1)
        DECLARE @Width varchar(15)
     
        DECLARE @sql nvarchar(max)
        DECLARE @sqlWidth varchar(15)
        SET @rows = 0
        --接著根據@Count去執行 For 迴圈
        --將Width的值各別查詢出來後,新增到另外一個資料庫
        --其中Width的查詢欄位是跟著迴圈去變化的變數值


--1. 查詢最後一筆新增進來資料的 Count 欄位,將值給@Count變數
     
        SELECT  top 1 @Count = Count FROM Data_Table1 ORDER BY ID DESC
     
        --2. 用WHIL迴圈執行

        WHILE(@rows < @count)
        BEGIN
                
                --設定sqlWidth的查詢字串,查詢Width的值
                --當迴圈跑第一次的時候@sqlWidth  =   'width1'
                --帶入查詢後就會取得width1的值,再將值複製給@Width這個變數

                SET @sqlWidth='width'+CAST(@rows+1 AS NVARCHAR) 
                SET @sql= N'SELECT @Width = '+@sqlWidth+' FROM Data_Table1'
                EXEC sp_executeSql @Sql, N'@Width varchar(15) output',@Width=@Width OUTPUT
        
        
               --接著就可以新增到Table2了
   
               INSERT INTO Data_Table2 width VALUES (@Width);
        
                SET @rows = @rows +1

END
     
END
GO




主要遇到的小問題
※ 查詢的欄位用變數時候要使用sp_executeSql
※ 要將執行結果儲存在變數 要寫像上面這樣(好複雜...原本想說用SET xx = SELECT..)
    EXEC Sp_executeSql @Sql, N'@Width varchar(15) output',@Width=@Width OUTPUT




沒有留言:

張貼留言