2009-11-07 2 views
0

내 응용 프로그램 중 하나에서 Dynamic SQl로 코딩 된 Proc가 있습니다. 성을 가진 신청자를 검색하는 데 사용됩니다. 지금은 성 또는 성으로 처음 2 자리 숫자로 신청자를 검색하고 있습니다. 그러나 나는 그들의성에 아포스트로피 (예 : O'Connor)가있는 신청자를 찾는 데 문제가 있습니다. 클라이언트가 O '또는 O'Connor로 신청자를 검색하려고하면 오류가 발생합니다. 그들은 성 (姓)에 아포스트로피가 있거나없는 모든 신청자를 검색하려고합니다. 제가 모든 것을 시도했지만 도움이되지 않습니다. 필요한아포스트로피 관련 문제

if Rtrim(@FirstName) <> '' 
begin 
    If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != '' 
     Set @FirstName = char(39) + @FirstName + '%' + char(39) 
end 

if Rtrim(@LastName) <> '' 
begin 
    If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != '' 
    Set @LastName = Char(39) + @LastName + '%' + char(39) 
end 

지금 만든다면

이 dinamically 입력에 필터 기본 당신은 탈출 할 필요가

if Rtrim(@LastName) <> '' 
select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName) 

답변

3

매개 변수 와일드 카드를 추가 : 다음 지원자를 끌어 오기 발동에 사용하여 내 검색 코드는 SQL 문자열을 빌드 할 때 입력 문자열의 아포스트로피 (기본적으로 단일 '2'로 바꿉니다)

당신이 선택하는 곳이면 어디서든주의해야합니다 se는 보안 문제 (SQL Injection Attacks)로 SQL 서버 데이터베이스에 사용자 입력을 전달합니다. Bobby Tables

if Rtrim(@LastName) <> '' 
select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + '' 
+0

Proc를 실행할 때 아래 오류가 발생합니다. Proc에서 Select 문을 인쇄합니다 - 제한 사항 때문에 전체 문장을 여기에 입력 할 수 없습니다. 다음과 같은 성을 인쇄 할 수 있습니다. 서버 : 메시지 170, 수준 15, 상태 1, 줄 1 : 'O'근처의 구문이 잘못되었습니다. 및 a.LastName like ''O''REILLY % '' – user203671

+0

하나의 아포스트로피를 두 개의 아포스트로피로 바꾸시겠습니까? 당신이 그것을 이중 인용 부호로 바꾸고있는 것처럼 보입니다 - 맞지 않습니다 – Murph

+0

그래서 내가 여기에 내가 가지고있는 코드를 추가해서 인쇄하십시오. 서버 : 메시지 170, 레벨 15, 상태 1, 줄 1 줄 1 : 'REILLY'근처의 구문이 잘못되었습니다. 서버 : 메시지 105, 수준 15, 상태 1, 줄 1 문자열 "전에"닫지 않은 따옴표. 및 'O'REILLY %'와 같은 .LastName – user203671

0

나의 제안은 이러한 # 같은 특수 문자로 대체 아포스트로피/따옴표로 필터링에 사용되는 다른 열을 포함하는 쿼리를 작성하는 것입니다. 이를 원할 경우 원래 열을 그대로 둘 수 있습니다.

는 SQL 서버에서이 작업을 수행하려면, 당신이 뭔가를 할 수 있습니다 :이 다른 열을 기준으로 필터링 할

Select 
    tbl.strName_Last, 
    REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter 
    .... 

그런 다음 코드를 변경하고 사용자가 제공 한 필터 문자열에 아포스트로피를 교체/특수 문자로 된 작은 따옴표.