0

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

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

但是,当我运行它时,出现此错误:

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

.

4

5 回答 5

2

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

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

您的子选择正在返回所有strIndex以更新每一行。那太矫枉过正了。只需对一行中的值执行castand即可。replace

于 2013-03-07T00:41:14.077 回答
1

正如错误所说,您在这里返回了多个记录:

select strIndex from works

因此,您正在尝试使用 works 表中的每个 strIndex 值更新单个值。这行不通。

如何让它工作真的取决于你想要做什么。由于您还没有在这里讨论,我不会推测什么会解决这个错误。

于 2013-03-07T00:40:28.427 回答
0

您遇到的错误基本上是说您正在尝试为 nIndex 获取多个结果,因为这是以下结果: select strIndex from works

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

为此,您需要有一些限制结果的东西: select strIndex from works WHERE PRIMARY_KEY = SOMETHING 这不是解决您的问题的有效方法,但您可以理解。

由于两列在同一个表中,这根本没有必要,您可以简单地执行以下操作:

更新作品集 nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)

于 2013-03-07T01:03:27.827 回答
0

您还可以在子查询中添加TOP1,这将修复该错误

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

但由于我们没有上下文,因此不保证结果是您所期望的。

于 2013-03-07T00:53:34.510 回答
0

除了其他回复外,我怀疑您并不是要更换char(10)两次。您可能想要的是同时替换char(10)and 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().

于 2013-03-07T01:16:45.267 回答