如果我尝试同时设置两个列,有人知道为什么我的更新无效吗?
UPDATE mytable
SET [Customer] = RIGHT([Customer], CHARINDEX('#', REVERSE([Customer])) -1) ,
[Segment] = RIGHT([Segment], CHARINDEX('#', REVERSE([Segment])) -1)
WHERE CHARINDEX('#', [Customer]) > 0 OR
CHARINDEX('#', [Segment]) > 0
如果我只更新一列来运行查询,那么它可以正常工作。如果我同时运行,我得到以下错误:
Invalid length parameter passed to the RIGHT function. The statement has been terminated.
我知道当CHARINDEX返回0时会发生这种情况,但我试图用WHERE子句来控制它。
答案 0 :(得分:3)
OR
子句中有WHERE
。如果您确实想要控制它,请将其替换为AND
:
UPDATE mytable
SET [Customer] = RIGHT([Customer], CHARINDEX('#', REVERSE([Customer])) -1) ,
[Segment] = RIGHT([Segment], CHARINDEX('#', REVERSE([Segment])) -1)
WHERE CHARINDEX('#', [Customer]) > 0 AND
CHARINDEX('#', [Segment]) > 0
可替换地:
UPDATE mytable
SET [Customer] = (CASE WHEN Customer LIKE '%#%'
THEN RIGHT([Customer], CHARINDEX('#', REVERSE([Customer])) -1)
ELSE Customer
END)
[Segment] = (CASE WHEN Segment LIKE '%#%'
THEN RIGHT([Segment], CHARINDEX('#', REVERSE([Segment])) -1)
ELSE Segment
END)
WHERE Customer LIKE '%#%' OR Segment LIKE '%#%';
答案 1 :(得分:0)
您的错误消息的原因是传递给RIGHT
函数的负值。来自BOL:
<强> integer_expression 强> 是一个正整数,指定将返回character_expression的字符数。如果integer_expression为负数,则返回错误。
您的WHERE
条件包含OR
,这将允许行没有&#34;#&#34;被包括在&#34;其他&#34;列确实包含一个。
尝试将OR
修改为AND
:
UPDATE mytable
SET [Customer] = RIGHT([Customer], CHARINDEX('#', REVERSE([Customer])) -1) ,
[Segment] = RIGHT([Segment], CHARINDEX('#', REVERSE([Segment])) -1)
WHERE CHARINDEX('#', [Customer]) > 0 AND
CHARINDEX('#', [Segment]) > 0
答案 2 :(得分:0)
如果您想更新两者,有时,其中一个或另一个将更新&#34;#&#34;然后你可以使用:
UPDATE MyTable
SET
Customer = CASE
WHEN CHARINDEX('#', Customer) > 0 THEN RIGHT(Customer, CHARINDEX('#', REVERSE(Customer)) -1)
ELSE Customer
END,
Segment = CASE
WHEN CHARINDEX('#', Segment) > 0 THEN RIGHT(Segment, CHARINDEX('#', REVERSE(Segment)) -1)
ELSE Segment
END
WHERE
CHARINDEX('#', Customer) > 0 OR
CHARINDEX('#', Segment) > 0
当然,或者你可以将它分解为两个UPDATE
语句,但我认为这个语句会运行得更快,因为它只需要通过表格。
答案 3 :(得分:0)
可能是这样的:
UPDATE mytable SET
[Customer] = Case When CHARINDEX('#', [Customer]) > 0 Then RIGHT([Customer], CHARINDEX('#', REVERSE([Customer])) -1) Else [Customer] End ,
[Segment] = Case When CHARINDEX('#', [Segment]) > 0 Then RIGHT([Segment], CHARINDEX('#', REVERSE([Segment])) -1) Else [Segment] End
WHERE
CHARINDEX('#', [Customer]) > 0 OR
CHARINDEX('#', [Segment]) > 0