2017-07-16 4 views
1

からのSQLServerトリガーを実行することができます私はいくつかの異なるフィールドを連結することにより、製品の説明を作成単一のSQLServerのテーブルに複数のトリガを持っている、いくつかは、別のテーブルからデータを別のテーブルに製品を挿入トリガーを取得します。はどのように私はC#

私は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'を試してみましたが、それdoesntのは、新製品が作成または更新されたときに、私はボタンclick_event上のC#からこれを実行すると同じ問題

を取得し、私を助けて。任意のアイデアが評価されます

+0

プログラムでは実行できない/トリガーを呼び出すことはできませんが、それは理にかなっていません。データベースのトリガーは、データの挿入、削除、更新などのコマンドが実行されたときに実行されます。トリガを 'AFTER insert、UPDATE'の後に実行させるには、実際にテーブルにデータを挿入したり更新したりする必要があります。 C#でできることは、例えば、ストアドプロシージャや関数を呼び出すことです。 – Alisson

+0

ありがとうございます@アリソンこれを行うための主な理由は、私は計算されたフィールドといくつかのトリガの前に実行するこのトリガは、完全な情報を取得しないでください2番目のアップデートで正しい値を取得します。 @example sp_settriggerorder @ triggername = N '[dbo]。、@ order = N'Last'、@ stmttype = N'INSERT''を避ける方法はありますか?同じ問題が発生する – user8066749

+0

@Alissonまたはボタンをクリックしてテーブルのフィールドの値に何らかの値を設定する方法があるので、トリガーを2回発射して完全な結果を得る – user8066749

答えて

3

トリガを呼び出すことはできません。あなたのケースでは、自動的に、そしてすべての行に対してトリガーされるべきです: 挿入、更新後。

あなたは、私が代わりにトリガーを使用するのでであることを示唆しているものをいくつかのボタンをクリックした後、このクエリを実行する必要がある場合は、新しいストアドプロシージャを作成します。 ここで問題となるのは、挿入されたテーブルを使用せずに[STOCK NO]を更新する必要があるかどうかを知る必要があることです。

+0

ありがとう@キムレイジ私は手動で実行したい主な理由は、何らかの理由でこのトリガーが計算フィールドといくつかのトリガーの前に実行されるので、私は更新または挿入後に他のテーブルに挿入するための完全な情報を取得しません初めて。私は同じ問題 – user8066749

+1

は多くを持つ得る、順番@ = N'Last」、 '[WHL-MISYSSETUP]。[DBO]' 'EXEC sp_settriggerorderする@ triggername = Nを試してみましたstmttype = N'INSERT'' @それdoesntのは、私を助けて表のトリガーはパフォーマンス上の問題が多いため、あまり良い設計ではありません。とにかく、必要なすべての操作を順番に行うことができます。私はあなたのケースのための最高の解決策だとは思わないが、それはちょうどうまくいくかもしれない... –