0 votes

Trigger in Sql

Je commence simplement avec les déclencheurs SQL Server et j'ai des problèmes avec ce problème :

Faites un déclencheur à faire : une fois qu'un progiciel est installé sur un PC, l'installateur n'a plus qu'à fournir les données pour pack, tagnum et instdate. La colonne softcost doit être modifiée en fonction du packcost du package.

    CREATE TRIGGER software_on_install_fill_in
ON software
FOR INSERT, UPDATE
AS
    --declare the names and types of variables you will use
    DECLARE @software_pack char(4), @software_tagnum char(5), 
            @software_datetime datetime, @software_softcost numeric(10,2)
BEGIN
    --set the variables to values
    SET @software_pack = (SELECT software.PACK FROM software, inserted i)
    SET @software_tagnum = (SELECT software.TAGNUM FROM software, inserted i)
    SET @software_datetime = (SELECT software.INSTDATE FROM software, inserted i)

    UPDATE software
    --apply logic to auto update softcost column of inserted row
    SET @software_softcost = (SELECT package.PACKCOST 
                              FROM package, inserted i
                              WHERE SOFTCOST = @software_softcost)
END
GO

-- Try a test case, which fails
insert software(PACK, TAGNUM, INSTDATE)
values('ac11', '32494', '9/14/1998 0:00:01')
GO

--Try to see if contents of the table have changed, also fails
select * from software

J'obtiens l'erreur suivante :

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Je pense que quelque chose ne va pas avec mon instruction d'insertion, comme mentionné dans ce blog, car le déclencheur semble s'exécuter avec succès. C'est ce que je suis censé faire ?

Gratitude

0voto

Jimmy Neutron Points 70

Le problème se trouve dans les sous-requêtes qui sont utilisées pour récupérer les valeurs des colonnes PACK, TAGNUM et INSTDATE à partir de la table SOFTWARE et de la table INSERTEDE. Ces sous-requêtes peuvent retourner plusieurs valeurs, ce qui génère l'erreur "Subquery returned more than 1 value".

Pour résoudre ce problème, vous pouvez utiliser une jointure entre la table SOFTWARE et la table INSERTEDE, comme ceci :

SET @software_pack = (SELECT s.PACK FROM software s INNER JOIN inserted i ON s.ID = i.ID)
SET @software_tagnum = (SELECT s.TAGNUM FROM software s INNER JOIN inserted i ON s.ID = i.ID)
SET @software_datetime = (SELECT s.INSTDATE FROM software s INNER JOIN inserted i ON s.ID = i.ID)

Cela devrait permettre de récupérer les valeurs des colonnes PACK, TAGNUM et INSTDATE pour la ligne insérée ou modifiée dans la table SOFTWARE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X