2009-10-14 7 views
1

Je n'ai aucune idée pourquoi je reçois cette erreur: -Qu'est-ce qui cause l'erreur "La sous-requête a renvoyé plus d'une valeur ..."?

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

je cherchais à exécuter cette requête: -

ALTER TABLE Test1 NOCHECK CONSTRAINT ALL 
ALTER TABLE Test2 NOCHECK CONSTRAINT ALL 


UPDATE Test1 
SET ID= '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' 
WHERE ID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45'; 
UPDATE Test2 
SET ID = '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' , 
SpecID = NULL , 
RefLastName = 'Dummy' , 
RefFirstName = 'First Name' , 
RefMiddleName = NULL , 
RefPhone1 = '111444444' , 
RefPhone2 = '2121222' , 
RefFax = '222222' , 
RefEmail = '[email protected]' 
WHERE 
RefID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45' 

ALTER TABLE Test1 WITH CHECK CHECK CONSTRAINT ALL 
ALTER TABLE Test2 WITH CHECK CHECK CONSTRAINT ALL 

Répondre

6

L'une des tables que vous mettez à jour possède-t-elle un déclencheur? Si c'est le cas, il contient probablement une sous-requête avec plus d'une valeur.

Personnellement, je trouve très mauvais de désactiver les contraintes de vérification lors d'insertions ou de mises à jour. Ils sont là pour une raison et si vos données ne répondent pas à ces contraintes, elles ne doivent pas être insérées telles quelles ou la contrainte doit être ajustée pour de nouvelles conditions. Cela peut également créer des problèmes si les enregistrements sont mis à jour à l'avenir.

+0

Merci pour l'indice. Erreur à cause du déclencheur. BTW, je suis d'accord que c'est une mauvaise pratique. Mais je pense que c'est comment je peux accomplir ma tâche de Synchronisation d'une ancienne base de données avec la nouvelle base de données (mise à jour un changement drastique dans les structures de Table). Dans la nouvelle base de données, tous les GUID sont nouveaux. :( – Jango

+0

Je vous suggère fortement de modifier votre trigger pour gérer plusieurs mises à jour ou d'élever une erreur plus significative si plusieurs lignes sont dans le sous-select –

+0

Il doit être en train de modifier les colonnes des deux côtés d'une contrainte FK. cela sans les désactiver (ce que je peux penser, en supposant des colonnes NOT NULL) est de faire une nouvelle entrée dans la table A, mettre à jour la table B pour pointer vers la nouvelle entrée dans A, puis supprimer l'ancienne entrée dans A. –

0

On dirait que vous avez besoin d'un point-virgule pour mettre fin à cette déclaration:

UPDATE Test 
SET RefID = '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' 
WHERE RefID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45'; 

UPDATE RefPhysician 
SET RefID = '05f6c6b4-63ff-45b2-a5e2-920d5dce3e45' , 
SpecID = NULL , 
RefLastName = 'DR. BRAD DIBBLE' , 
RefFirstName = 'First Name' , 
RefMiddleName = NULL , 
RefPhone1 = '613444444' , 
RefPhone2 = 'print,read,866,1' , 
RefFax = '6476476464' , 
RefEmail = '[email protected]' 
WHERE RefID = '05e6c6b4-63ff-45b2-a5e2-920d5dce3e45' ; <-- semicolon 
+0

cela n'a pas fonctionné. – Jango

+0

Eh bien, juste pour être sûr, essayez de terminer chaque déclaration SQL avec un point-virgule. –

Questions connexes