我更新整个表的查询如下所示:
update works set nIndex = cast(replace(replace((select strIndex
from works), char(10), ''), char(10), '') as int)
但是,当我运行它时,出现此错误:
“子查询返回的值超过 1 个。当子查询跟随 =、!=、<、<=、>、>= 或将子查询用作表达式时,这是不允许的。”
.
我更新整个表的查询如下所示:
update works set nIndex = cast(replace(replace((select strIndex
from works), char(10), ''), char(10), '') as int)
但是,当我运行它时,出现此错误:
“子查询返回的值超过 1 个。当子查询跟随 =、!=、<、<=、>、>= 或将子查询用作表达式时,这是不允许的。”
.
您不需要子选择。尝试这个:
update works
set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)
您的子选择正在返回所有值strIndex
以更新每一行。那太矫枉过正了。只需对一行中的值执行cast
and即可。replace
正如错误所说,您在这里返回了多个记录:
select strIndex from works
因此,您正在尝试使用 works 表中的每个 strIndex 值更新单个值。这行不通。
如何让它工作真的取决于你想要做什么。由于您还没有在这里讨论,我不会推测什么会解决这个错误。
您遇到的错误基本上是说您正在尝试为 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)
您还可以在子查询中添加TOP1,这将修复该错误
update works set nIndex = cast(replace(replace((select TOP 1 strIndex
from works), char(10), ''), char(10), '') as int)
但由于我们没有上下文,因此不保证结果是您所期望的。
除了其他回复外,我怀疑您并不是要更换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()
.