错误:子查询返回的值超过1

时间:2013-03-07 00:38:09

标签: sql sql-server

我更新整个表的查询如下所示:

update works set nIndex = cast(replace(replace((select strIndex 
 from works), char(10), ''), char(10), '') as int)

然而,当我运行它时,我收到此错误:

  

“子查询返回的值超过1。当这个值不允许时   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。“

5 个答案:

答案 0 :(得分:2)

您不需要子选择。试试这个:

update works
     set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)

您的子选择返回所有 strIndex的值以更新每一行。这太过分了。只需对一行中的值执行castreplace

答案 1 :(得分:1)

如错误所示,您在此处返回多条记录:

select strIndex from works

因此,您尝试使用works表中的每个strIndex值更新单个值。这不起作用。

如何让这个工作真正取决于你想要做什么。由于你还没有进入这里,我不会推测出什么能解决错误。

答案 2 :(得分:0)

您还可以在子查询中添加 TOP1 ,这样可以解决该错误

update works set nIndex = cast(replace(replace((select TOP 1 strIndex 
from works), char(10), ''), char(10), '') as int)

但是,由于我们没有上下文,但是并没有保证结果是你期望的结果。

答案 3 :(得分:0)

您遇到的错误基本上是说您试图将几个结果发送到nIndex,因为这是以下结果: 从作品中选择strIndex

忘记你所说的所有演员和替换: nIndex =(1,2,3,4,...)这是不可能的,因为你只能在那里给一个值。

为此,您需要有限制结果的东西: 从作品WHERE PRIMARY_KEY = SOMETHING中选择strIndex 这不是解决问题的有效方法,但是您可以理解。

由于这两列位于同一个表中,因此根本不需要,您只需执行以下操作:

更新工作集nIndex = cast(替换(替换(strIndex,char(10),''),char(10),'')为int)

答案 4 :(得分:0)

除了其他回复之外,我怀疑你并不是要两次替换char(10)。你可能想要的是替换char(10)char(13)

UPDATE dbo.works 
  SET nIndex = CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), ''));

当然,由于strIndex是一个字符串,它可能包含除CR / LF之外的其他字符,因此您可能想要添加WHERE子句:

WHERE ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1;

或者您可以在更新中使用CASE表达式,以确保将不兼容的值设置为NULL,例如:

UPDATE dbo.works 
  SET nIndex = CASE 
    WHEN ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1
  THEN 
    CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), '')) 
  ELSE NULL END;

在SQL Server 2012中,这种逻辑更简单,例如TRY_CONVERT()