2017-04-18 9 views
0

나는 테이블의 열에서 문자열을 추출하는 CHARINDEX와 함께 LEFT를 사용하는 것을 시도하고 있지만 다음과 같은 오류사용 LEFT

을 제공

메시지 레벨 53, 수준 16, 상태 2, 줄 1 LEFT 또는 SUBSTRING 함수에 잘못된 길이 매개 변수가 전달되었습니다. 그러나

select name, left(name, charindex('\',name) - 1) as sub 
from sys.servers 

, 내가

declare @mytext varchar(max) 
set @mytext = 'hello\world' 
SET @MyText = LEFT(@MyText, CHARINDEX('\', @MyText) - 1) 
print @mytext 

O/P: 
---- 
hello 

은 알려 주시기 바랍니다 .. 작동 변수를 사용하여 하나의 문자열에 동일 적용하면 내가 뭘 잘못하고 있는가?

+1

백 슬래시가 없을 때 쿼리를 반환 하시겠습니까? –

답변

1

name에는 백 슬래시가 없을 수 있습니다. 이것은 쉽게 고칠 수 있지만 결과에 따라 달라집니다. - 그 left()의 길이 오류가

select name, 
     left(name, charindex('\', name + '\') - 1) as sub 
from sys.servers; 

문제는 charindex() 반환 0 값이 존재하지 않는 것입니다 : 백 슬래시가없는 경우에 전체 이름을 제공합니다. 당신이 할 수있는 일

+0

그 이름 + '\';) –

0

에는 '\'텍스트

declare @mytext varchar(max) 
set @mytext = 'hello world' 
SET @MyText = LEFT(@MyText, iif(CHARINDEX('\', @MyText)>0,CHARINDEX('\', @MyText) - 1,len(@mytext))) 
print @mytext 

CASE 내부가

SET @MyText = LEFT(@MyText, 
CASE 
    WHEN CHARINDEX('\', @MyText) > 0 THEN CHARINDEX('\', @MyText) - 1 
    ELSE LEN(@mytext) 
END) 

PRINT @mytext 
+0

고든 Linoff & maSTA rHiA 귀하의 소중한 답변을 주셔서 감사합니다. 내가 왜 T SQL에 전문가가 아니므로 텍스트에 '\'이 없을 때 오류가 발생하는 이유는 무엇인지 직접 알지 못했습니다. 불행히도, 연결된 서버를 쿼리하는 인스턴스가 SQL 2008을 실행하고 있으므로 IIF 함수를 사용할 수 없습니다. 그러나 당신이 제안한대로 사례 발표문을 사용하여 주위를 둘러 보았습니다. 선택 이름, 이름 다음 왼쪽 '%의 \의 %'와 같은 경우 (이름, charIndex에 ('\', 이름) - 1) 다른 sys.servers에서 하위 로 끝의 이름은 –

+0

그냥 경우에 스크립트를 업데이트 문 – maSTAShuFu

0

는 찾을 수 없을 때 때 오류를 피하기 위해 SQL 2012 + 또는 케이스에 대한 IIF를 사용하는 것입니다 이름에 '\'이 있으면 0을 반환하므로 최종 결과는 유효하지 않습니다 (이름, -1). 따라서 -1이 있으면 0으로 처리 할 필요가있는 코드를 작성해야합니다. 아래 코드는 그 문제를 해결합니다.

select name, left(name, ISNULL(NULLIF(charindex('\',name) - 1,-1),0)) as sub from sys.servers 
+0

'\'문자가없는 경우 전체 이름을 반환해야하는 경우 아래 코드를 사용할 수 있습니다. 'sys.servers'에서 서브 이름으로 이름, 왼쪽 (name, ISNULL (NULLIF (charindex ('\', name) -1, -1), LEN (Name)))을 sub –