在更新语句中传递给 RIGHT 函数的长度参数无效
Invalid length parameter passed to the RIGHT function in update statement
有人知道为什么我尝试同时设置两个列时更新不起作用吗?
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 returns 0 时会发生这种情况,但我正在尝试使用 WHERE 子句来控制它。
您在 WHERE
子句中有一个 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
或者:
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 '%#%';
您的错误消息的原因是传递给 RIGHT
函数的负值。来自 BOL:
integer_expression
Is a positive integer that specifies how many characters of character_expression will be returned. If integer_expression is negative, an error is returned.
您的 WHERE
条件包含 OR
,这将允许在 "other" 列确实包含行的情况下包含没有“#”的行。
尝试将您的 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
如果您想同时更新两者,并且有时一个或另一个会有“#”,那么您可以使用:
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
语句,但我认为这个 运行 更快,因为它只需要通过 [=18] =].
可能是这样的:
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 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 returns 0 时会发生这种情况,但我正在尝试使用 WHERE 子句来控制它。
您在 WHERE
子句中有一个 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
或者:
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 '%#%';
您的错误消息的原因是传递给 RIGHT
函数的负值。来自 BOL:
integer_expression Is a positive integer that specifies how many characters of character_expression will be returned. If integer_expression is negative, an error is returned.
您的 WHERE
条件包含 OR
,这将允许在 "other" 列确实包含行的情况下包含没有“#”的行。
尝试将您的 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
如果您想同时更新两者,并且有时一个或另一个会有“#”,那么您可以使用:
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
语句,但我认为这个 运行 更快,因为它只需要通过 [=18] =].
可能是这样的:
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