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 返回 0 时会发生这种情况,但我试图用 WHERE 子句来控制它。

4

4 回答 4

3

你有一个ORinWHERE子句。如果您真的想控制它,请将其替换为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 '%#%';
于 2016-06-03T14:18:42.210 回答
0

RIGHT您的错误消息的原因是传递给函数的负值。来自BOL

integer_expression 是一个正整数,指定将返回 character_expression 的字符数。如果 integer_expression 为负数,则返回错误。

您的WHERE条件包含一个OR,这将允许在“其他”列包含一个的地方包含没有“#”的行。

尝试将您的修改ORAND

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
于 2016-06-03T14:21:15.243 回答
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语句,但我认为这条语句会运行得更快,因为它只需要通过表格即可。

于 2016-06-03T14:27:09.040 回答
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
于 2016-06-03T14:28:15.880 回答