문제

테이블을 변경할 수없는 3 번째 Pary 앱으로 작업하고 있습니다. 우리는 추가 DateTime 열 "AsofDate"가있는 "월간"테이블을 구축하여 월말에 데이터를 버리고 해당 데이터를 달의 마지막 날짜에 표시했습니다.

단일 저장 프로 시저를 만들 수 있기를 원합니다 (응용 프로그램은 모든 보고서의 소스로보기 또는 저장 Proc를 요구하도록 설계되었습니다.) 현재 데이터 테이블을 사용하는 매개 변수를 사용합니다 (매개 변수는 null 또는 = today 's 날짜) 또는 월말 테이블과 필터를 사용하여 달 날짜까지 필터를 사용하십시오. 이런 식으로, 사용자가 특정 월말 기간의 현재 또는 데이터를 사용할 수있는 한 보고서가 있습니다.

당신이 선호하는 (그리고 왜) 죄송합니다. 이것은 완전히 코딩되지 않았습니다.

솔루션 #1 Union Query

Create Proc Balance_Report (@AsOfDate)
AS

Select Column1
From
    (Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
    Union 
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    ) AS All_Balances
Where All_Balances.AsOfDate = @AsOfDate

솔루션 #2 IF 문을 사용하여 테이블을 선택하십시오

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
Else
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    Where AsOfDate = @AsOfDate

다시 말하지만, 이것은 완전히 코딩되지 않았으며 일종의 DB 비가 핵입니다 (그러나 SQL Server 2005).

편집 : 별도의 저장 절차를 사용하여 솔루션 #2 변형

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Exec Current_Balance_Date -- no param necessary
Else
    exec MonthEnd_Balance_Date @AsOfDate
도움이 되었습니까?

해결책

물건을 설정하는 방법은 두 번째 방법이 더 빠를 것입니다. 파티션 된 뷰를 사용하려면 최적화 된 방식으로 SELECT에서 하나 이상의 테이블을 무시하는 것으로 알 수있는 방식으로 제약 조건을 설정할 수 있으며 동일한 성능을 얻을 수 있습니다. 이렇게하면 두 가지 진술을 동기화하지 않고 모든 논리를 하나의 진술로 유지할 수 있습니다. Select 문이 얼마나 복잡한 지에 따라 귀하에게 문제가 될 수도 있고 아닐 수도 있습니다.

그러나 기억해야 할 한 가지는 두 번째 방법을 사용하는 경우 저장 프로 시저를 (recompile)로 표시해야한다는 것입니다 (괄호 안에 필요한지 여부를 기억할 수 없습니다. 구문을 확인하십시오). 이렇게하면 Optimizer는 IF 문의 지점을 실행 해야하는 새로운 쿼리 계획을 작성합니다.

다른 팁

나는 비 결합 솔루션을 선호합니다. 단일 테이블에서 선택하는 것은 노조를 수행하고 Union에서 단일 테이블의 데이터를 선택하는 것보다 항상 빠릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top