2011-08-15 1 views
1

J'utilise des déclencheurs d'insertion/mise à jour pour mettre à jour la colonne Price d'une deuxième table.Déclencheur de mise à jour avec GROUP BY

Le déclencheur d'insertion semble fonctionner parfaitement, mais lorsque je tente de changer un seul enregistrement dans SSMS, je reçois une erreur:

The row value(s) updated or deleted either do not make the row unique or they alter multiple rows(2 rows).

Ceci est ma mise à jour trigger:

CREATE TRIGGER [dbo].[trgUpdateMasterData] ON [dbo].[tabSparePartMasterData_Temp] 
AFTER UPDATE 
AS 

UPDATE tabSparePart 
SET  Price = MD.Price 
FROM tabSparePart INNER JOIN 
(
    SELECT  inserted.[Material Number (SAP)] AS MaterialNumber, inserted.Price 
    FROM   inserted 
    GROUP BY [Material Number (SAP)], inserted.Price 
) MD 
ON tabSparePart.SparePartName = MD.MaterialNumber 

Je dois regrouper par numéro de matériel parce qu'il y a des lignes redondantes insérées dans la table tabSparePartMasterData_Temp que je n'utilise que pour mettre à jour le prix de pièce de rechange dans tabSparePart. Mais j'ai supposé que le groupe par trierait les doublons (prix est identique pour tout doublon).

Il est possible que les enregistrements insérés/mis à jour 'MaterialNumber ne soient pas disponibles dans tabSparepart. Dans ce cas, cet enregistrement devrait être "ignoré". Est-ce que le INNER JOIN en tient compte?

+0

Ce qui génère le message d'erreur s'il vous plaît? Cela ne ressemble pas à SQL ... – gbn

+0

Y at-il par hasard une contrainte unique sur '(tabSparePart.Price)' ou sur '(tabSparePart.SparePartName, tabSparePart.Price)'? S'il existe deux ou plusieurs «tabSparePart.SparePartName» identiques, votre mise à jour peut violer la contrainte, et c'est peut-être ce qui s'est réellement passé. –

+0

@gbn: SQL-Server Management-Studio (SSMS) lorsque j'essaie de changer une valeur de prix dans la table avec le déclencheur. –

Répondre

5

Essayez d'ajouter SET NOCOUNT ON à la gâchette

Cette erreur ne ressemble pas à une erreur SQL et je devine le code client se trouble par la 2ème mise à jour dans la gâchette. Edit: cette erreur peut être provoquée par l'affichage de la grille de données dans SSMS étant stupide.

Ce n'est pas un message SQL que je pensais: il est un SSMS être un message stupide

Voir ce qui dit tout "apprendre à écrire SQL"

S aying cela, il ya un KB article sur un bogue dans SQL Server 2005 ...

+0

J'ai changé le déclencheur à 'SET NOCOUNT ON' mais l'erreur est la même. Que voulez-vous dire par "2ème mise à jour"? Je suis en train de mettre à jour une table différente de la table qui appartient à ce déclencheur. –

+0

@Tim Schmelter: il y a * deux * mises à jour ici même si sur des tables différentes. Certains clients sont confus par cela. http://stackoverflow.com/questions/1483732/set-nocount-on-usage – gbn

+0

Vous avez raison. J'ai ajouté le 'NOCOUNT' en haut du déclencheur mais j'ai dû l'insérer directement au-dessus de la' UPDATE'.Je vous remercie. –