2016-09-21 13 views
1

Database diagram我該怎麼做多重插入到多個表中的SQL Server

的SQL服務器如何可以插入一個SKU排進表SKU_DATA,然後用手頭所有分支機構和數量插入SKU到庫存表= 2和Quantityonhand = 0。

我需要插入一個SKU項目進入SKUDATA和庫存表對應的行所有現有分支機構Quantityonhand = 2和Quantityonhand = 0

請幫助謝謝

分公司

name varchar (30) not NULL, 
managerNum INT NOT NULL 

SKU_DATA

SKU Int NOT NULL IDENTITY (1000,1), 
description varchar (40) NOT NULL UNIQUE, 
department varchar(30) NOT NULL default 'Home Entertainment', 
sellingPrice numeric (7,2) NOT NULL 

INVENTORY

SKU Int NOT NULL, 
branch varchar (30) NOT NULL , 
quantityOnHand Int NOT NUll , 
quantityOnOrder Int NOT NUll 

觸發

CREATE TRIGGER NewSku 
ON dbo.SKU_DATA 
After INSERT 
as 
    begin 
     SET NOCOUNT ON; 

    declare 
@description varchar (40), 
    @department varchar(30), 
    @sellingPrice numeric (7,2) 


    DECLARE @Output TABLE (SKU INT) 

    INSERT INTO dbo.SKU_DATA ([DESCRIPTION], DEPARTMENT, SELLINGPRICE) 
     OUTPUT INSERTED.SKU INTO @Output(SKU)--getting Inserted ID from SKU_DATA to @Output table 
    VALUES (@description, @department, @sellingPrice); 


    INSERT INTO INVENTORY (SKU ,branch ,quantityOnHand ,quantityOnOrder) 
      --Loading SKU information against all branches to INVENTORY 
    SELECT t.SKU,b.name,2, 0 
    FROM Branch b 
    CROSS APPLY (SELECT SKU FROM @Output)t 
END 

NewSku 17行 無法插入NULL值插入列 '描述',表 'tt.dbo.SKU_DATA';列不允許有空值。 INSERT失敗。

回答

2

在sql中,您可以從INSERTED表中獲取插入的行詳細信息。

CREATE PROCEDURE InsertNewSkuWithInventory 
     @description varchar (40), 
     @department varchar(30), 
     @sellingPrice numeric (7,2) 
    AS 


    BEGIN 

     DECLARE @Output TABLE (SKU INT) 

     INSERT INTO dbo.SKU_DATA ([DESCRIPTION], DEPARTMENT, SELLINGPRICE) 
      OUTPUT INSERTED.SKU INTO @Output(SKU)--getting Inserted ID from SKU_DATA to @Output table 
     VALUES (@description, @department, @sellingPrice); 


     INSERT INTO INVENTORY (SKU ,branch ,quantityOnHand ,quantityOnOrder) 
       --Loading SKU information against all branches to INVENTORY 
     SELECT t.SKU,b.name,2, 0 
     FROM Branch b 
     CROSS APPLY (SELECT SKU FROM @Output)t 
    END 

如果你想寫一個觸發器,從上面的過程中刪除庫存插入部分,並寫下如下的觸發器。 對於SKU_Data表中的每個插入,此觸發器將被觸發並將數據插入到Inventory表中。

步驟:

CREATE PROCEDURE InsertNewSkuWithInventory 
     @description varchar (40), 
     @department varchar(30), 
     @sellingPrice numeric (7,2) 
    AS 


    BEGIN 

     INSERT INTO dbo.SKU_DATA ([DESCRIPTION], DEPARTMENT, SELLINGPRICE) 
     VALUES (@description, @department, @sellingPrice); 
END 

觸發:

CREATE TRIGGER UpdateInventory 
    ON dbo.SKU_DATA 
    AFTER INSERT 
    AS 

    INSERT INTO INVENTORY (SKU ,branch ,quantityOnHand ,quantityOnOrder) 
     --Loading SKU information against all branches to INVENTORY 
SELECT t.SKU,b.name,2, 0 
FROM Branch b 
CROSS APPLY (SELECT SKU FROM INSERTED)t 
+0

@Tanjim拉赫曼:根據扎克,他想將數據插入SKU_Data表和從表SKU_Data插入的ID被再次插入到Inventory錶針對所有分支。那麼上述查詢中的問題是什麼? –

+0

因爲我是新手,我不知道如何編寫這些代碼所需的一些語法 –

+0

@Tanjim Rahman:我不明白你在說什麼。只有當對SKU_DATA和Inserted ID進行的插入保存到輸出表時,輸出纔會返回值。這是SQL中通常的方法,用於將數據從另一個表的輸出插入到多個表中。 –

1

你不需要遊標。只需將所有分支插入#BranchList,其餘部分如下。

Create procedure InsertNewSkuWithInventory 
     @description varchar (40), 
     @department varchar(30), 
     @sellingPrice numeric (7,2), 
    AS 
     Declare @SKU as int 

     CREATE TABLE #BranchList 
     (
      branch varchar(30) 
     ) 

    BEGIN 
     INSERT INTO dbo.SKU_DATA (description, department, sellingPrice) 
     VALUES (@description, @department, @sellingPrice); 

     Select @SKU =SKU 
     From dbo.SKU_DATA 
     Where description = @description 
     And department = @department 
     And sellingPrice = @sellingPrice; 

     INSERT INTO #BranchList 
     -- Your code to fetch all branches 

     INSERT INTO INVENTORY 
     SELECT @SKU, branch, 2, 0 
     FROM #BranchList 
    END 
相關問題