[記錄]
需求:
當資料庫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
沒有留言:
張貼留言