문제

SQL Server의 저장 프로 시저에서 문자열을 어떻게 사용하여 사용하기에 안전하게하려면 어떻게해야합니까? LIKE 표현.

내가 있다고 가정 해 NVARCHAR 그렇게 변수 :

declare @myString NVARCHAR(100);

그리고 나는 그것을 사용하고 싶습니다 LIKE 표현:

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

문자열을 어떻게 탈출합니까 (보다 구체적으로는 의미있는 문자 LIKE 패턴 매칭, 예를 들어 % 또는 ?) T-SQL에서 이런 식으로 사용하는 것이 안전합니까?

예를 들어, 주어진 :

@myString = 'aa%bb'

원해요:

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

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

도움이 되었습니까?

해결책

같은 표현으로 특수 캐릭터를 탈출하려면 탈출 문자로 접두사를 접두사합니다. Escape Keyword와 함께 사용할 Escape Char를 선택할 수 있습니다. (MSDN 참조)

예를 들어 이것은 를 탈출 숯으로 사용하여 % 기호를 벗어납니다.

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 변수에 더 많은 공간을 할당해야합니다.

다른 팁

비슷한 문제가 있었기 때문에 (Nhibernate를 사용하여 탈출 키워드가 매우 어려웠을 것입니다) 브래킷 문자를 사용하여 해결했습니다. 그래서 당신의 샘플이 될 것입니다

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

증거가 필요한 경우 :

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

탈출하기보다는 모두 패턴 구문에 특별한 의미가있는 문자열의 문자 패턴으로 선행 와일드 카드를 사용하고 있다는 점에서 더 빠르고 쉽게 수행 할 수 있습니다.

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

주요 와일드 카드를 사용하지 않는 경우, 인덱스를 사용할 수 없으므로 위의 접근 방식을 피해야합니다. YourColumn.

또한 최적의 실행 계획이 일치하는 행의 수에 따라 달라지는 경우 사용하면 추정치가 더 나을 수 있습니다. LIKE 비교할 때 정사각형 브래킷이 구문을 빠져 나옵니다 둘 다 CHARINDEX 그리고 그만큼 ESCAPE 예어.

탈출 문자를 지정합니다. 여기 문서 :
http://msdn.microsoft.com/en-us/library/ms179859.aspx

탈출 캐릭터가 포함 된 문자열을 찾고 싶습니까? 예를 들어 당신은 이것을 원합니다 :

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

10%의 모든 필드를 어디에서 검색하고 싶습니까? 이 경우 탈출 절을 사용하여 탈출 문자를 지정하고 와일드 카드 문자를 탈출 할 수 있습니다.

select * from table where myfield like '%10!%%' ESCAPE '!'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top