2008-11-03 4 views
65

LIKE 식에서 사용하는 것이 안전하도록 SQL Server의 저장 프로 시저에서 문자열을 이스케이프 처리하려면 어떻게해야합니까?LIKE 식에서 사용하기에 안전하도록 SQL Server에서 문자열을 이스케이프 처리합니다.

가 나는 NVARCHAR 변수과 같이 있다고 가정

declare @myString NVARCHAR(100); 

그리고 나는 LIKE 표현식에서 사용할 : 문자를 좀 더 구체적으로 (문자열을 탈출하려면 어떻게

... WHERE ... LIKE '%' + @myString + '%'; 

그 은 LIKE 패턴 일치 (예 : % 또는 ?)에 의미가 있으므로 T-SQL에서 이러한 방식으로 사용하는 것이 안전합니까? 주어진 예를 들어

:

@myString = 'aa%bb' 

내가 원하는 :

WHERE ... LIKE '%' + @somehowEscapedMyString + '%' 

일치하는 'aa%bb', 'caa%bbc'하지만 'aaxbb' 또는 'caaxbb'.

+0

프로그래밍 언어를 입력하지 않았습니다. –

+0

그의 프로그래밍 언어는 T-SQL입니다. –

답변

81

LIKE 표현식에서 특수 문자를 이스케이프하려면 이스케이프 문자를 접두사로 붙입니다. ESCAPE 키워드와 함께 사용할 이스케이프 문자를 선택할 수 있습니다. (MSDN Ref)이 이스케이프 문자로 \를 사용하여 % 기호를 탈출 예를 들어

:

select * from table where myfield like '%15\% off%' ESCAPE '\' 

당신은 당신의 문자열에 일 무슨 문자 모른다, 당신은하지 않으려면 당신은, 이스케이프 문자 모든 와일드 카드 문자를 앞에 수, 와일드 카드로 처리 예 :

set @myString = replace( 
       replace( 
       replace( 
       replace(@myString 
       , '\', '\\') 
       , '%', '\%') 
       , '_', '\_') 
       , '[', '\[') 

(당신도 당신의 이스케이프 문자를 탈출해야합니다, 그리고 그것은 그래서 당신은 탈출하지 않는 내부 replace의 확인 다른 사람에게서 추가 된 것 replace 문). 다음과 같이 사용할 수 있습니다.

select * from table where myfield like '%' + @myString + '%' ESCAPE '\' 

@myString 변수에 더 많은 공간을 할당해야하므로 문자열 교체시 더 길어집니다.

+0

현재 http://stackoverflow.com/questions/13861004/escaping-the-escape-character-does-not-work-sql-like-operator에 언급 된 접근법을 사용하고 있습니다. 해당 코드의 단점이 있습니까? – Lijo

+2

@Lijo, 괜찮습니다. 그 대답은 C#에서 벗어나지 만, 위의 대답은 SQL에서 C#과 다르다는 점에서 그렇습니다. 어쨌든 결과는 동일합니다 : 검색 문자열에있는 특수 문자를 이스케이프 처리하고 LIKE 문에 ESCAPE 키워드를 사용하십시오. – Rory

+0

작은 따옴표를 이스케이프해야한다고 생각합니다 ('\'로 아니라 두 개의 작은 따옴표로 바꿉니다). –

5

이스케이프 문자를 지정합니다. 여기에 문서 :
http://msdn.microsoft.com/en-us/library/ms179859.aspx

+1

나는 LIKE 표현에서 벗어나야 할 것이 무엇인지 이미 알고있는 것을 원했다. –

+0

대답은 당신이 자신의 탈출 문자를 지정하도록 제안했기 때문에 "의미있는"문자는 더 이상 의미가 없습니다. – Goran

3

이스케이프 문자가 포함 된 문자열을 찾으시겠습니까? 예를 들어, 다음을 원합니다.

select * from table where myfield like '%10%%'. 

10 % 인 모든 필드를 검색 할 위치는 어디입니까? 그렇다면 ESCAPE 절을 사용하여 이스케이프 문자를 지정하고 와일드 카드 문자를 이스케이프 처리 할 수 ​​있습니다.

select * from table where myfield like '%10!%%' ESCAPE '!' 
+0

나는 내가 원하는 것에 대한 예제를 추가했다. –

16

유사한 문제가 있었기 때문에 (NHibernate를 사용하므로 ESCAPE 키워드가 매우 어려웠을 것입니다) 대괄호 문자를 사용하여 해결했습니다.

create table test (field nvarchar(100)) 
go 
insert test values ('abcdef%hijklm') 
insert test values ('abcdefghijklm') 
go 
select * from test where field like 'abcdef[%]hijklm' 
go 
+0

이것은 가장 좋은 답변입니다. 이스케이프에 의존하지 않고 모든 문자열에 사용할 수 있습니다. – John

+0

나는 이것이 가장 단순하고 구도자가 찾고있는 것과 가장 가까운 것이라고 생각한다. ESCAPE가 어떤 경우에는 그다지 유용하지 않다고 말하는 것은 아닙니다. – bitoolean

12

보다는 당신이 최고의 와일드 카드를 사용하고 있는지 주어진 패턴 구문에서 특별한 의미가 문자열의 모든 문자를 탈출 : 당신이 증거를 필요로하는 경우 그래서 샘플은

WHERE ... LIKE '%aa[%]bb%' 

이 될 것입니다 패턴에서 그것은 단지 더 빠르고 쉽습니다. 이 YourColumn에 인덱스를 사용할 수 없습니다 당신이 접근 위의 선도적 인 와일드 카드를 사용하지 않는 경우

SELECT * 
FROM YourTable 
WHERE CHARINDEX(@myString , YourColumn) > 0 

그러나 피해야한다. 최적의 실행을 계획하고 both CHARINDEXthe ESCAPE keyword에 비해 구문 탈출 대괄호로 LIKE 사용시 추정 좋을 수도 일치 행의 수에 따라 달라질 경우 또한

.

+0

우수! 그러나 만약 와일드 카드가 없다면 어떨까요? – Colin

+1

@Colin - 와일드 카드가 없거나 문자열에있는 모든 ** 와일드 카드 문자를 이스케이프 처리하는 것이 목적이라면 대신'= '을 사용할 수 있습니다. 이스케이프 특수 문자 응답은 여전히 ​​특정 값으로 시작하는 값을 찾는 쿼리에 유용 할 수 있지만 'LIKE'는 인덱스를 사용할 수 있지만 'CHARINDEX'는 사용할 수 없습니다. –