LIKE 식에서 안전하게 사용할 수 있도록 SQL Server에서 문자열 이스케이프
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'
.
LIKE 식에서 특수 문자를 이스케이프하려면 이스케이프 문자로 접두사를 붙입니다.ESCAPE 키워드와 함께 사용할 이스케이프 문자를 선택할 수 있습니다. (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를 사용하므로 ESCAPE 키워드가 매우 어려웠을 것입니다) 괄호 문자를 사용하여 해결했습니다.그래서 당신의 샘플은
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
및 키워드와 비교할 때 대괄호 이스케이프 구문을 사용합니다.
이스케이프 문자를 지정합니다.여기 설명서:
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 '!'
대체 이스케이프 구문:
JDBC 드라이버는 LIKE 절 와일드카드를 리터럴로 사용하기 위한 {escape 'escape' 문자'} 구문을 지원합니다.
SELECT *
FROM tab
WHERE col LIKE 'a\_c' {escape '\'};
언급URL : https://stackoverflow.com/questions/258757/escape-a-string-in-sql-server-so-that-it-is-safe-to-use-in-like-expression
'programing' 카테고리의 다른 글
문자열을 VB의 Enum 값으로 구문 분석합니다.그물 (0) | 2023.05.12 |
---|---|
로컬 변경 내용을 삭제하지 않고 git 스위치 분기 (0) | 2023.05.12 |
Eclipse 실행 파일 시작 프로그램 오류:동반자 공유 라이브러리를 찾을 수 없습니다. (0) | 2023.05.12 |
열거형에 포함될 수 있는 모든 값을 가져오기 위한 SQL 쿼리 (0) | 2023.05.12 |
문자열에서 정수 값을 swift로 가져옵니다. (0) | 2023.05.12 |