我更新整个表的查询如下所示:
update works set nIndex = cast(replace(replace((select strIndex
from works), char(10), ''), char(10), '') as int)
然而,当我运行它时,我收到此错误:
“子查询返回的值超过1。当这个值不允许时 子查询跟随=,!=,<,< =,>,> =或当子查询用作 表达。“
答案 0 :(得分:2)
您不需要子选择。试试这个:
update works
set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)
您的子选择返回所有 strIndex
的值以更新每一行。这太过分了。只需对一行中的值执行cast
和replace
。
答案 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()