SQL Server에서 문자열을 탈출하여 표현식에서 사용하는 것이 안전합니다.
-
06-07-2019 - |
문제
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 '!'