からの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#からこれを実行すると同じ問題
を取得し、私を助けて。任意のアイデアが評価されます
プログラムでは実行できない/トリガーを呼び出すことはできませんが、それは理にかなっていません。データベースのトリガーは、データの挿入、削除、更新などのコマンドが実行されたときに実行されます。トリガを 'AFTER insert、UPDATE'の後に実行させるには、実際にテーブルにデータを挿入したり更新したりする必要があります。 C#でできることは、例えば、ストアドプロシージャや関数を呼び出すことです。 – Alisson
ありがとうございます@アリソンこれを行うための主な理由は、私は計算されたフィールドといくつかのトリガの前に実行するこのトリガは、完全な情報を取得しないでください2番目のアップデートで正しい値を取得します。 @example sp_settriggerorder @ triggername = N '[dbo]。、@ order = N'Last'、@ stmttype = N'INSERT''を避ける方法はありますか?同じ問題が発生する – user8066749
@Alissonまたはボタンをクリックしてテーブルのフィールドの値に何らかの値を設定する方法があるので、トリガーを2回発射して完全な結果を得る – user8066749