Update Trigger Subquery retourné plus de 1 valeur

Update Trigger Subquery retourné plus de 1 valeur de nombreux exemples similaires

Ce code semble avoir de problème, parce que vous utilisez l’opérateur égal, et la sous-requête est de retourner plus d’une valeur. Vous devez vérifier les valeurs en double:

Peut-être pour la condition "SKU = @newSTOCKCODE" il y a plus d’une ligne, ou vous avez eu à utiliser IN au lieu de =

Une chose de plus! Vous pouvez lire la table inserted fois:

SELECT @ var1 = Col1, @ var2 = Col2, @ var3 = Col3 DE INSÉRÉ

Aussi, vous pouvez avoir instruction UPDATE unique lorsque vous mettez à jour la même table avec le même état:

  • Edité par Amin Sobati jeudi, Janvier 03, 2013 15:37

Votre déclencheur ne peut fonctionner que si seule ligne est mis à jour. si plus d’une volonté mise à jour alors il wil briser. avec la même erreur.


SET @newSTOCKCODE = (SELECT [CODE STOCK] FROM Inséré)
SET @newDESCRIPTION = (SELECT [DESCRIPTION] FROM Inséré)
SET @newPACK = (PACK SELECT FROM Inséré)
SET @newLANE = (LANE SELECT DE Inséré)
SET @newWHOLESALE_PRICE = (SELECT [PRIX WHOLESALE] FROM Inséré)
SET @newRETAIL_PRICE = (SELECT [PRIX DE DÉTAIL] FROM Inséré)
SET @newMRP = (SELECT MRP DE Inséré)
.

Chaque fois que Inséré obtenir plus d’un enregistrement code ci-dessus se brisera ..

mieux serait si vous pouvez ré écrire votre code pour gérer plus de record en trigger ..

Ce code semble avoir de problème, parce que vous utilisez l’opérateur égal, et la sous-requête est de retourner plus d’une valeur. Vous devez vérifier les valeurs en double:

Salut Comment pourrais-je faire cela.

Votre déclencheur est écrit sur la base d’une hypothèse qu’une seule ligne est mis à jour. Votre déclaration de mise à jour affecte plusieurs lignes (sans doute – vous ne dites pas). Votre déclencheur devrait être réécrite soit soutenir les mises à jour multi-lignes ou pour générer une erreur si plusieurs lignes ont été mises à jour. Ceci est une erreur commune – ne supportant pas les mises à jour multi-lignes – et a été discutée à plusieurs reprises dans les forums. Un peu de recherche va trouver de nombreux exemples similaires qui montrent "avant" code (support de ligne unique) et "après" code (support multi-ligne).

Pendant que vous y êtes, arrêtez de faire ces mises à jour des colonnes simples à la même table. Il suffit de mettre à jour la ligne dans le produit une fois en réglant toutes les colonnes affectées à la variable associée – des conseils qui deviendra sans objet si vous convertissez votre logique pour soutenir les mises à jour multi-lignes.

  • Proposé comme réponse par Naomi N Modérateur jeudi, Janvier 03, 2013 18:42

Oui, je dois convertir ma logique à l’appui multi-rangs de mise à jour

quelqu’un pourrait me donner s’il vous plaît un exemple ou un lien pour mettre à jour plusieurs – ligne mise à jour de.

Votre déclencheur ne peut fonctionner que si seule ligne est mis à jour. si plus d’une volonté mise à jour alors il wil briser. avec la même erreur.

Pas exactement. Il ne reviendra pas une erreur, mais choisir une seule valeur à attribuer à la variable.

Tout d’abord, un lien vers la documentation dans BOL

Pour vos besoins, je vous suggère de commencer par écrire une instruction select simple qui fait ce que vous voulez en supposant que les effets de votre déclaration de mise à jour d’origine. Ce sera au moins vous aider à démarrer en termes de réflexion sur l’ensemble des lignes affectées par la statment, si elle ne vous donne pas accès à la "original" les valeurs qui se trouvent dans le tableau supprimé virtuel (qui semble être un point discutable puisque votre logique ne se soucie pas d’eux). Quelque chose comme:

; avec cte_inserted que (sélectionner. de dbo.Stock où [CODE BARRE SOURCE] = ‘0501012381953’)
sélectionner. de dbo.Product comme Prod jointure interne cte_inserted comme Ins sur Prod
sur Prod.SKU = Ins. [Code de stock]

Espérons que je décodé correctement votre logique. Avec cela comme un début, vous pouvez ajouter des éléments à la liste de sélection pour les colonnes qui doivent être mis à jour, la source de cette mise à jour, les clés primaires, etc. Cela vous permettra de voir l’interaction de la resultset simulée trouvée dans le tableau inséré en se joignant à la "destination" table. Avec ce travail, vous pouvez convertir la logique en trigger logique (Ou vous pouvez essayer votre main à modifier l’instruction select dans une instruction de mise à jour pour vous assurer que vous comprenez comment le faire). Puisque vous mettez à jour plusieurs tables, vous devrez répéter ce processus pour votre "une variante" table. Un dernier commentaire – être certain que vous comprenez la relation entre les tables. Votre table de stock semble avoir 2 identifiants logiques (Stock Code et ID).

Source: social.msdn.microsoft.com

Lire la suite

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

un × 1 =