2013-10-18 2 views
1

나는 테이블에 내가 0으로 디폴트 한 매개 변수의 선언에 비트 형식의 칼럼 "상태"를하고 난비트 데이터 타입 조건

@FirstName varchar(20) = null, 
@LastName varchar(20) = null, 
@Status bit = 0 
를 null로 채무 불이행에 오는 몇 가지 다른 매개 변수가있는 경우

내 SQL은

Select * from customers where 
(ISNULL(@FirstName,'') ='' OR FirstName= @FirstName) 
AND (ISNULL(@LastName,'') ='' OR LastName= @LastName) 
AND (Status = @Status) 

상황 만 @FirstName 값이 코드 및 테이블과 @status에 대한 어떤 가치 "상태 = 1"이 전송되는 컬럼의 값에서 보낸 경우 같은, @Status의 기본값은 0이므로 레코드가 반환되지 않습니다. 비트 유형에 대한 매개 변수가 전송되지 않고 테이블의 값이 1 인 상황에서 비트 유형을 처리하는 방법은 다음과 같습니다.

+0

나는 당신이 묻는 것에 대해 명확하지 않으며 브라켓팅의 관점에서 예제 코드가 불균형 해지는 데 도움이되지 않습니다. –

+0

@Damien_The_Unbeliever는 적절한 대괄호를 추가했습니다. 감사합니다. – sansid

답변

1

매개 변수의 기본값을 null으로 설정할 수 있습니다. 당신은 다른 매개 변수를 가지고 있습니다.

@Status bit = null 

당신은 데이터베이스의 값이 null의 경우 행을 반환하지 않습니다이

where 
    isnull(@firstname, Firstname) = FirstName 
and 
    isnull(@LastName, LastName) = LastName 
and 
    isnull(@Status, Status) = Status 

모두이, 그리고 원래의 쿼리를 수행하여 필터를 합리화 할 수 있습니다.

+0

null로 설정하더라도 비트 값의 기본값은 false이며 코드에서 0을 가져옵니다. – sansid

+2

프로 시저를 호출하는 방법에 문제가 있거나 매개 변수가 선언되는 방식에 문제가 있습니다. – podiluska

-1

동적 쿼리가 필요합니다. 이것 좀 보아라. 여기에서 몇 가지가 빠져있을 수도있다. 실제 SQL이 생성 될 때마다 ''당신에게 단일 '을 제공합니다.

Declare @sql as varchar(200) 
Set @sql=' 
Select * from customers where 
(ISNULL('[email protected]+','''') ='''' OR FirstName='+ @FirstName+') 
AND (ISNULL('[email protected]+','''') ='''' OR LastName='+ @LastName+') 
AND 1=1' 

if @status <>'' or @status is not null // or replace with your default value 
begin 
    set @sql = @sql+ ' And Status ='+ Convert(varchar, @Status) 
end 

print (@sql)// to check you dynamically generated sql. 
after when you are ssured then use exec 

--exec(@sql) 

이러한 동적 쿼리의 한 가지 단점은 취약점에 취약하다는 것입니다. 하지만 소규모 응용 프로그램이나 격리/제한된 환경에서 실행되는 응용 프로그램을 사용하면 안전하다고 생각합니다.