2016-12-15 3 views
1

조건부 WHERE 절을 구현해야하는 저장 프로 시저가 있습니다.SQL Server 저장 프로 시저에서 조건을 수행하는 방법

나는 @name 매개 변수, @startdate@enddate 매개 변수를가집니다.

  • @name is null 경우와 @startdate & @enddate가 다음 날짜 범위에 대한 데이터를 반환 주어집니다 :

    어떻게 조건을 작성할 수 있습니다.

  • @name이 주어진 경우 @startdate & @enddate is null 여기에

내 전류

  • @name 경우와 @startdate & @enddate 다음 이름 날짜 범위 평가 데이터를 반환 주어진 이름에 대한 데이터를 반환 절차

    alter procedure dbo.sp_emp 
        @name varchar(50), 
        @startdate date, 
        @enddate date 
    as 
    begin 
        select * 
        from employee 
        where 
         Name = @name 
         and dob between @startdate and @enddate 
    end 
    
  • +0

    ISNULL 버전. 너의 의미를 잘못 해석하면 고쳐주세요. – scsimon

    +0

    사이드 노트 : 저장 프로 시저에'sp_' 접두사를 사용하지 말아야합니다 **. Microsoft는 [자체 저장을 위해이 접두어를 예약했습니다 (* 저장 프로 시저 명명 * 참조)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) 및 당신은 미래에 언젠가 이름 충돌의 위험을 감수해야합니다. [저장 프로 시저 성능에 좋지 않습니다.] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). 'sp_'를 피하고 다른 것을 접두어로 사용하는 것이 가장 좋습니다. –

    답변

    0

    DECLARE @query NVARCHAR(2048); 
    
    SET @query = 'select * from employee where Name = ''' + @name + ''''; 
    
    IF @startdate IS NOT NULL AND @enddate IS NOT NULL 
        SET @query += ' AND dob between ''' + @startdate + ''' and ''' + @enddate ''''; 
    
    EXECUTE(@query); 
    

    SQL 인젝션에 대해주의해야합니다.

    1

    나는 COALESCE이 문제를 해결한다고 생각합니다.

    alter procedure dbo.sp_emp 
    @name varchar(50), 
    @startdate date, 
    @enddate date 
    as 
    begin 
    select * 
    from employee 
    where Name = (COALESCE(@name, name)) 
        AND dob between COALESCE(@startdate, dob) and COALESCE(@enddate, dob) 
    end 
    

    나는 귀하의 질문에 모두가 좀 더 명확하게하기 위해 편집

    alter procedure dbo.sp_emp 
    @name varchar(50), 
    @startdate date, 
    @enddate date 
    as 
    begin 
    select * 
    FROM employee 
    WHERE Name = ISNULL(@name, name) 
        AND dob between ISNULL(@startdate, dob) AND ISNULL(@enddate, dob) 
    end