2016-05-11 2 views
1

Désolé à l'avance pour mon anglais, voici le problème: que je ne peux pas penser à la logique de la détente, la ligne de fond est qu'il ya 2 tables:déclencheur de mise à jour, ajouter ne fonctionne pas correctement

  • liste de matériel
  • l'arrivée Journal

Lorsque vous ajoutez des enregistrements à une table dans le magazine de la paroisse doit utiliser un déclencheur qui vérifie si la table est vide ajouter une nouvelle entrée (matériel, quantité en stock), si la table contient des enregistrements, mettez-les à jour à la condition que le Material = (select the part Name From inserted), mais si la table contient des enregistrements et Material != select the part Name From inserted), ajoutez un nouvel enregistrement.

Voici le code du déclencheur:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER Trigger [dbo].[Application Log Sheet] 
ON [dbo].[Parish magazine] 
FOR INSERT 
AS 
    DECLARE @a INT; 
    DECLARE @b int; 

    SELECT @a = COUNT(*) 
    FROM Bill of materials 

    IF @a > 0 
    BEGIN 
     UPDATE Vedomostithe 
     SET Kolichestvennogo = the Number of stock + (select Quantity from inserted) 
     WHERE Material = (select the part Name from inserted) 
    END 
    ELSE IF @a >= 0 
     INSERT INTO Bill of material(Material, Quantity in stock) 
      SELECT the part Name, Number 
      FROM the arrival Journal 
      WHERE [ID] IN (SELECT [ID] FROM inserted) 

Tableau nomenclature:

create table Bill of materials 
(
    ID int primary key, 
    Material nvarchar(max), 
    Quantity in stock int 
) 

Table arrivée Journal:

create table Journal of the parish 
(
    ID int primary key, 
    Part name nvarchar(max), 
    The number of int 
) 
+0

Quelle version de SQL Server ciblez-vous? –

+0

J'ai la version de SQL Server 2016 –

Répondre

1

D'une part, vous shouldn » t stocker données pouvant être calculé, puisque tout ce que cela fait vous donne l'occasion pour le calcul stocké d'être incompatible avec le reste des données. En tant que tel, je recommande habituellement juste d'avoir une vue qui montre les totaux. En revanche, cela ressemble à une simple tâche pour MERGE. Mais nous devons garder à l'esprit que inserted peut contenir plusieurs lignes, et ceux-ci pourraient être pour plusieurs parties différentes. Donc, nous voulons quelque chose comme:

ALTER Trigger [dbo].[Application Log Sheet] 
ON [dbo].[Parish magazine] 
for insert 
AS 

MERGE INTO [Bill of Materials] t 
USING (SELECT PART, SUM(Quantity) as Qty from inserted group by PART) s 
ON t.Part = s.Part 
WHEN MATCHED THEN UPDATE SET Quantity = t.Quantity + s.Qty 
WHEN NOT MATCHED THEN INSERT (Part,Quantity) VALUES (s.Part,s.Qty) 

Toutes mes excuses si certains noms sont incorrectes ci-dessus, mais nous espérons que vous pouvez voir comment l'adapter à vos besoins (vous des questions semble bascule entre les différentes tables/colonnes noms tels qu'il semble y avoir environ quatre noms de tables différents, alors que vous commencez votre question en disant qu'il y en a deux).

+0

Merci beaucoup! Maintenant, je connais le MERGE! –