2016-06-03 1 views
0

동시에 열 두 개를 설정하려고하면 내 업데이트가 작동하지 않는 이유를 아는 사람이 있습니까?업데이트 문에서 RIGHT 함수에 전달 된 길이 매개 변수가 올바르지 않습니다.

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 절과 그 제어하려고 할 때 이런 일 수 있다는 것을 알고 : 나는 모두 실행하면, 나는 다음과 같은 잘못을 얻을.

답변

3

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 '%#%'; 
+0

안녕 고든, 는 내가 그것을 언급하지 않았다 미안 해요,하지만 난 시도 같은 결과 .. 그런 다음 쿼리 실행되지만 항상 0 행에 영향을 .. 하지만 내가 개별적으로 실행할 때 모든 행에 영향을 미친다는 것을 알고 있습니다. 모두 영향을받습니다. –

+0

그래, 지금 비어있는 데이터의 경우라고 생각합니다. 일부 데이터가 없습니다. 테이블 아직. 감사! –

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 
+0

설명 주셔서 감사합니다! –

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 문으로 나눌 수도 있지만,이 방법은 테이블을 한 번 통과시켜야하기 때문에 더 빠르게 실행될 것이라고 생각합니다.

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 
+0

아마도 이것이 실제로 가장 좋은 해결책 일 것입니다. 고맙습니다! –