2017-07-16 27 views
1

我有一個單一的sqlserver表中的多個觸發器通過連接不同的字段創建一個產品的描述,一些從另一個表中獲取數據和一個產品插入另一個表的觸發器。我怎麼能從C運行sqlserver觸發器#

我想運行觸發器,它將數據插入到另一個數據庫表上,點擊C#按鈕。

這裏是我的代碼可以插入或安裝產品到另一個表

Create TRIGGER [dbo].[WHL-MISYSSETUP] 
    ON [dbo].[WHEELS] 
    AFTER insert,UPDATE 
    AS 
    BEGIN 
    IF TRIGGER_NESTLEVEL() > 1 
    RETURN 

    ---------------------------------------------------// INSERT PRODUCT INFO TO MASTER TABLE ---------------------------------------------------------------- 
SET ANSI_WARNINGS OFF; 

      BEGIN 
    IF NOT EXISTS (SELECT * FROM [MITESTCO].dbo.[MIITEM] 
        WHERE [MITESTCO].dbo.[MIITEM].itemId IN (select [STOCK NO] from inserted) and [MITESTCO].dbo.[MIITEM].descr IN (select [PURCHASE DESCRIPTION] from inserted)) 

    BEGIN 
INSERT INTO [MITESTCO].dbo.MIITEM 
    ([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])--,[unitWgt] 
SELECT [STOCK NO], [PURCHASE DESCRIPTION2], [SALES DESCRIPTION2], [STOCK NO] ,'EA' ,'EA' ,'1',[WORK INSTRUCTION-WHL], '2','0'--,[APPROX. WGT.] 
    FROM [inserted] 
WHERE [STOCK NO] NOT IN (SELECT [itemId] FROM [MITESTCO].dbo.[MIITEM] WHERE itemId NOT LIKE '*-CI') 
AND [MAKE/BUY]='Make'; 
END 

END 
    SET ANSI_WARNINGS ON; 



     SET ANSI_WARNINGS off; 
      BEGIN 
    IF NOT EXISTS (SELECT * FROM [MITESTCO].dbo.[MIITEM] 
        WHERE [MITESTCO].dbo.[MIITEM].itemId IN (select [STOCK NO] from inserted) and [MITESTCO].dbo.[MIITEM].descr IN (select [PURCHASE DESCRIPTION] from inserted)) 

    BEGIN 
INSERT INTO [MITESTCO].dbo.MIITEM 
    ([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])--,[unitWgt] 
SELECT [STOCK NO], [PURCHASE DESCRIPTION2], [SALES DESCRIPTION2], [STOCK NO] ,'EA' ,'EA' ,'1',[WORK INSTRUCTION-WHL], '2','0'--,[APPROX. WGT.] 
    FROM [inserted] 
WHERE [STOCK NO] NOT IN (SELECT [itemId] FROM [MITESTCO].dbo.[MIITEM] WHERE itemId NOT LIKE '*-CI') 
AND [MAKE/BUY]='BUY'; 
END 
END 
    SET ANSI_WARNINGS on; 



---------------------------------------------------// INSERT PRODUCT INFO TO BOM HEADER TABLE ---------------------------------------------------------------- 

    SET ANSI_WARNINGS OFF; 
DECLARE @d DATETIME = GETDATE(); 
INSERT INTO [MITESTCO].[dbo].[MIBOMH] 
    ([bomItem], [bomRev], [rollup], [mult], [autoBuild], [assyLead],[revCmnt],[author],[descr],[qPerLead],[lstMainDt],[revDate],[effStartDate],[ovride]) 
    -- DECLARE @d DATETIME = GETDATE(); 
SELECT [STOCK NO], [bomRev], '1', '1', '1', '3','SYNC FROM TV','username','WHL FROM PDM','0', FORMAT(@d, 'yyyy-MM-dd HH\:mm\:ss\.fff', 'en-US') AS 'Format#1',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2','0' 
FROM [INSERTED] 
WHERE [STOCK NO] NOT IN (SELECT [MITESTCO].[dbo].[MIBOMH].[bomItem] FROM [MITESTCO].[dbo].[MIBOMH] where bomRev != [bomRev]) 
AND [STOCK NO] IN (SELECT [MITESTCO].[dbo].[MIITEM].[ItemId] FROM [MITESTCO].[dbo].[MIITEM] where type='2'); 
    SET ANSI_WARNINGS ON; 
---------------------------------------------------// INSERT PRODUCT INFO TO BOM DETAIL TABLE ---------------------------------------------------------------- 
    SET ANSI_WARNINGS OFF; 

    ;with cte as (
    select 
    [STOCK NO]  
    , u.rev 
    , bomEntry = row_number() over (order by u.ordinal) 
    , u.Partid 
    , u.Qty--='1' 
    , cmnt = '' 
    , srcLoc = 'DS' 
    , dType = '0' 
    , lead = '0' 
    , lineNbr = row_number() over (order by u.ordinal) 
    --, bomRev 
from [inserted] 
    cross apply (values 
    ('1',[bomRev],1,[BOM-WHEEL PN]) 
    ,('1',[bomRev],2,[BOM - RIM PN]) 
    ,('1',[bomRev],3,[BOM - SECONDARY DISC PN]) 
    ,('1',[bomRev],4,[BOM - FIN DISC PN]) 
    ,('1',[bomRev],5,[BOM - FLAT FIN DISC PN]) 
    ,([WHL BOM QTY 1],[bomRev],6,[WHL BOM PART 1 PN]) 
    ,([WHL BOM QTY 2],[bomRev],7,[WHL BOM PART 2 PN]) 
    ,([WHL BOM QTY 3],[bomRev],8,[WHL BOM PART 3 PN]) 
    ,([WHL BOM QTY 4],[bomRev],9,[WHL BOM PART 4 PN]) 
    ,([WHL BOM QTY 5],[bomRev],10,[WHL BOM PART 5 PN]) 
    ,('1',[bomRev],11,[COLOR-PN]) 
) u (Qty,rev, ordinal, partId) 
where nullif(u.partId, '') is not null 
) 
INSERT INTO [MITESTCO].dbo.[MIBOMD] 
    ([bomItem], [bomRev], [bomEntry], [partId], [qty],[cmnt],[srcLoc],[dType],[lead],[lineNbr]) 
    select 
    cte.[STOCK NO] 
    , cte.rev 
    , cte.bomEntry 
    , cte.Partid 
    , cte.Qty 
    , cte.cmnt 
    , cte.srcLoc 
    , cte.dType 
    , cte.lead 
    , cte.lineNbr 
from cte 
where not exists (
    select 1 
    from [MITESTCO].dbo.[MIBOMD] w 
    where w.[bomItem] = cte.[STOCK NO] 
     and w.[bomRev] = cte.rev 
     and w.[bomEntry]= cte.bomEntry 
); 
SET ANSI_WARNINGS ON; 
---------------------------------------------------// end Creates BOM STRUCTURE ---------------------------------------------------------------- 

,我想手動或按鈕來運行它的點擊事件是因爲某種原因,這觸發運行計算的前場和主要的原因一些觸發器,所以我沒有得到完整的信息插入或更新後第一次插入到其他表。我試過EXEC sp_settriggerorder @triggername=N'[dbo].[WHL-MISYSSETUP]', @order=N'Last', @stmttype=N'INSERT',但這並不幫助我,我得到同樣的問題

當新產品創建或更新我想從C#運行此按鈕click_event。任何想法將讚賞

+0

恐怕你不能以編程方式運行/調用觸發器,這甚至沒有意義。數據庫觸發器響應某些正在執行的命令而運行,例如插入,刪除或更新數據。如果你想讓觸發器運行'AFTER insert,UPDATE',你可能需要實際插入和/或更新數據到你的表中。例如,使用C#可以調用存儲過程或函數。 – Alisson

+0

謝謝@Alisson這樣做的主要原因是我得到了第二次更新的正確值,這個觸發器在計算字段和一些觸發器之前運行,所以我沒有得到完整的信息。是否有任何方法可以避免我試過'EXEC sp_settriggerorder @ triggername = N'[dbo]。[WHL-MISYSSETUP]',@ order = N'Last',@ stmttype = N'INSERT''但我不幫助我得到同樣的問題 – user8066749

+0

@Alisson或者有沒有什麼方法可以在按鈕上點擊某個值來設置表格中的某個字段,所以我觸發兩次觸發器,以便得到完整的結果 – user8066749

回答

3

觸發器不能被調用。它們應該被自動觸發並且針對每一行,在您的情況下: AFTER insert,UPDATE。

如果您需要在單擊某個按鈕後運行此查詢,而不是使用觸發器,請創建一個新的存儲過程。 這裏的問題是,您將不得不知道在不使用插入表的情況下需要更新的[STOCK NO]。

+0

謝謝@Kim Lage我想要手動運行它的主要原因是由於某種原因,此觸發器在計算字段和某些觸發器之前運行,所以我沒有獲取完整信息以便在更新或插入後插入到其他表中第一次。我嘗試過'EXEC sp_settriggerorder @ triggername = N'[dbo]。[WHL-MISYSSETUP]',@ order = N'Last',@ stmttype = N'INSERT''但是這並不幫助我,我得到同樣的問題 – user8066749

+1

有很多觸發器表不是一個很好的設計,因爲你可能有很多性能問題。無論如何,你可以嘗試用你需要的所有操作來製作一個大觸發器。我不認爲它是您的案例的最佳解決方案,但它可能只是工作... –