0

同時に2つの列を設定しようとすると、更新が機能しない理由を誰かが知っていますか?

  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

1 つの列だけを更新してクエリを実行すると、期待どおりに機能します。両方で実行すると、次のエラーが発生します。

Invalid length parameter passed to the RIGHT function. The statement has been terminated.

CHARINDEX が 0 を返したときにこれが発生する可能性があることはわかっていますが、WHERE 句でそれを制御しようとしています。

4

4 に答える 4

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 '%#%';
于 2016-06-03T14:18:42.210 に答える
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 に答える