sql
  • sql-server
  • sql-server-2005
  • 2011-09-01 4 views 0 likes 
    0

    회계 연도 매개 변수에 대해 2010 년, 2011 년 및 2012 년 옵션을 선택할 수 있지만 "제출 된 날짜"열에 2011 년 날짜가 여전히 표시됩니다. 예를 들어 2010 년을 선택하면 2010 년에 제출 된 데이터 만 보여 주어야하며 모든 연도 동안 똑같이 표시해야합니다. 어떤 도움이 필요합니까?동적 SQL을 사용하는 저장 프로 시저가 잘못된 데이터를 반환합니다.

    set @sqlstr = ' 
        Select 
        [SchoolName] As [School Name], 
        Status= CASE WHEN PS.PrivateSchoolID = Ed.PrivateSchoolID THEN ''Submitted'' 
         ELSE ''Not Submitted''END, 
        [Submitted By]= CASE WHEN PS.PrivateSchoolID = Ed.PrivateSchoolID 
          THEN [FirstName] + '' '' + [LastName] ELSE NULL END, 
        [Submitted On]= CASE WHEN PS.PrivateSchoolID = Ed.PrivateSchoolID 
           THEN Convert(Varchar(10), Ed.CreatedDate, 101) ELSE NULL END 
        From EnrollmentDateSchool Ed Right Outer Join 
        (select FP.FiscalYear, PrivateSchool.* from PrivateSchool 
         INNER JOIN FiscalYearPrivateSchool FP 
           ON PrivateSchool.PrivateSchoolID = FP.PrivateSchoolID) PS 
          ON Ed.PrivateSchoolID = PS.PrivateSchoolID Left Outer Join 
        Finance.dbo.Person P ON Ed.CreatedBy = P.PersonID 
        Where (FiscalYear = '+convert(varchar, @FiscalYear)+') AND (PS.IsActive = 1)' 
    
    
    IF (@SchoolID != -1) 
        set @sqlstr = @sqlstr + ' AND SchoolID ='+ convert(varchar, @SchoolID) 
    
    IF (@Status = -1) 
        set @sqlstr = @sqlstr + ' AND (PS.PrivateSchoolID = PS.PrivateSchoolID' + ')' 
    ELSE IF (@Status = 1) 
        set @sqlstr = @sqlstr + ' AND (PS.PrivateSchoolID = Ed.PrivateSchoolID' + ')' 
    ELSE 
        set @sqlstr = @sqlstr + 'AND (Ed.PrivateSchoolID is null' + ')' 
    
        SET @sqlstr = @sqlstr + 'ORDER BY SchoolName' 
    EXEC(@sqlstr) 
    END 
    
    +2

    EXEC (@sqlstr) 대신'PRINT @sqlstr; '을 사용할 때 출력을 표시 할 수 있습니까? –

    +1

    또한 길이가없는 CONVERT (VARCHAR,')를 사용하지 마십시오. 왜? http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar- without-length.aspx –

    답변

    6

    여기 동적 SQL은 필요하지 않습니다.

    SELECT 
        ... 
    FROM ... 
    WHERE FiscalYea[email protected] AND PS.IsActive=1 
    AND (@SchoolID = -1 OR [email protected]) 
    AND ((@Status = -1) 
         OR (@Status=1 AND PS.PrivateSchoolID = Ed.PrivateSchoolID) 
         OR (Ed.PrivateSchoolID is null)) 
    ORDER BY SchoolName 
    
    +4

    +1 나는 아주 비슷한 것을 올리려고했는데, WHERE 절을 만드는 동적 SQL은 아기 예수를 울게한다. – Yuck

    +0

    나는 비슷한 것을 게시하고있다. ...) –

    +0

    아론 편집을 해주셔서 감사합니다. – Jamiec

    관련 문제