2009-10-14 95 views
1

我没有任何想法,为什么我收到此错误: -什么导致“子查询返回多个值...”错误?

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. 

我试图运行此查询: -

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 

回答

6

您正在更新的表中是否有一个触发器?如果是这样,可能它包含具有多个值的子查询。

就我个人而言,我发现在插入或更新时关闭检查约束是非常糟糕的做法。他们在那里是有原因的,如果你的数据不符合这些约束条件,它不应该按原样插入,或者约束需要根据新的条件进行调整。如果将来记录更新,它也会产生问题。

+0

感谢您的线索。错误是因为触发器。顺便说一句,我同意这是一个不好的做法。但我认为这就是我如何实现将旧数据库与新数据库同步的任务(更新了一个表格结构的巨大变化)。在新数据库中,所有GUID都是新的。 :( – Jango 2009-10-14 15:37:58

+0

我强烈建议你考虑改变你的触发来处理多个更新或提高一个更有意义的错误,如果多行是在子选择。 – 2009-10-14 15:40:47

+0

他一定是上FK约束双方修改的列。只有这样,才能做到如果没有禁用它们(即我能想到的,假设NOT NULL列)是使表A的新条目,更新表B到点到一个新的条目,然后删除A. – 2009-10-14 15:40:48

0

看起来像你需要一个分号来结束这个语句:

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

它没有工作。 – Jango 2009-10-14 15:00:36

+0

嗯,可以肯定的是,尝试用分号结束每个SQL语句。 – 2009-10-14 15:15:40