2013-11-25 5 views
0

SSRS에서 변수 입력을 참조하는 저장 프로 시저를 만들려고합니다. 다음은 복잡한 쿼리의 코드입니다. 나는 CTE를 사용하여 코드를 더 읽기 쉽게 만든다.SSRS에서 사용할 변수 저장 프로 시저 만들기

/****** Object: StoredProcedure [dbo].[adm_AuditHospMonth] Script Date: 11/25/2013 9:39:10 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

/* 
-- ============================================= 
-- Author:  Scott Schmeling 
-- Create date: 11/25/2013 
-- Description: Determines the products in which the price was lowered and revenue lost during a set time period. 
-- ============================================= 
*/ 


Create Procedure dbo.PriceErosion 
    @StartDate as Date 
    ,@EndDate as Date 
    ,@CurDate as Date 
    ,@Hospital as Int 
    ,@Division as Int 

as 

/* 
Test Data 

Declare @StartDate as Date 
Declare @EndDate as Date 
Declare @Hospital as Int 
Declare @Division as Int 
DECLARE @curDate Date 

SET @curDate = GETDATE() 
Set @StartDate = CASE WHEN @StartDate IS NULL THEN DATEADD(dd, -31, Dateadd(dd, -1, @curdate)) ELSE @StartDate END 
Set @EndDate = CASE WHEN @EndDate IS NULL THEN Dateadd(dd, -1, @curdate) ELSE @EndDate END 
Set @Hospital = 3; 
*/ 

Begin 

    -- Sets the Baseline Price Date in the PriceChangeHistory Table. 
    With PC1 
    as 
     (Select 
      HospitalMasterID 
      ,TxnCode 
      ,UserInfoMasterID 
      ,Active 
      ,min(TxnDateTime) as StartingDate 
     From 
     PriceChangeHistory 
     Where 
     TxnDateTime Between @StartDate and @EndDate 
     Group By 
      HospitalMasterID, TxnCode, UserInfoMasterID, Active) 

    -- Gets the Baseline Price for the period from the PriceChangeHistory Table 
    ,PC 
    as 
     (Select 
      PC1.HospitalMasterID 
      ,PC1.TxnCode 
      ,PC1.UserInfoMasterID 
      ,PC1.Active 
      ,Cast (PC1.StartingDate as Date) as StartingDate 
      ,PC2.OldPrice as StartingPrice 
      ,PC2.NewPrice 
      ,PC2.TxnSubType 
     From 
     PC1 
     Inner Join 
     PriceChangeHistory as PC2 
     On 
     PC1.HospitalMasterID = PC2.HospitalMasterID 
     and 
     PC1.TxnCode = PC2.TxnCode 
     and 
     PC1.StartingDate = PC2.TxnDateTime 
     Where 
     PC2.OldPrice > PC2.NewPrice) 

    --MedicalHistory Information 
    ,MH 
    as 
     (Select 
      HospitalMasterID 
      ,PatientID 
      ,TxnDate 
      ,TxnCode 
      ,Description 
      ,ListAmount 
      ,ExtendedAmount 
      ,TxnType 
      ,Quantity 
      ,(Case 
       When Quantity <> '1' Then (ListAmount/Quantity) 
       Else ListAmount 
       End) as UnitPrice 
     From 
      MedicalHistory 
     Where 
      TxnDate Between @StartDate and @EndDate 
      and 
      _IsServOrITem = 1) 

    -- Determines the Revenue lost per each sale, also reduces the results to only those items where the Price was lowered not raised. 
    ,RL 
    as 
     (Select 
      PC.HospitalMasterID 
      ,MH.PatientID 
      ,PC.TxnCode 
      ,PC.TxnSubType 
      ,MH.Description 
      ,PC.UserInfoMasterID as ChangedByUserID 
      ,MH.TxnDate 
      ,PC.StartingPrice 
      ,Cast (MH.UnitPrice as Money) as UnitPrice 
      ,Cast ((StartingPrice - UnitPrice) as Money) as RevenueLost 
     From 
     PC 
     Left OUter Join 
     MH 
     on 
     PC.HospitalMasterID = MH.HospitalMasterID 
     and 
     PC.TxnCode = MH.TxnCode 
     Where 
     PC.StartingPrice > MH.UnitPrice) 

    --- Determine the name of the tech changing the prices. 
    ,UI 
    as 
     (Select 
      HospitalMasterID 
      ,UserInfoMasterID 
      ,Name 
     From 
      UserInfo) 

    --- Get the Division and Hospital Name for each Hospital. 

    ,HODI 
    as 
     (Select 
      DI.DivisionID 
      ,DI.DivisionName 
      ,HO.HospMastID 
      ,HO.HospCode 
      ,HO.HospName 
     From 
      ref_Hospital as HO 
      inner Join 
      ref_Division as DI 
      on 
      HO.DivisionID = DI.DivisionID) 

    ,HI 
    as 
     (Select 
      HODI.DivisionID 
      ,HODI.DivisionName 
      ,RL.HospitalMasterID 
      ,HODI.HospCode 
      ,HODI.HospName 
      ,RL.PatientID 
      ,RL.TxnCode 
      ,RL.TxnSubType 
      ,RL.Description 
      ,RL.ChangedByUserID 
      ,RL.TxnDate 
      ,RL.StartingPrice 
      ,RL.UnitPrice 
      ,RL.RevenueLost 
     From 
      RL 
      Left Outer Join 
      HODI 
      ON 
      RL.HospitalMasterID = HODI.HospMastID 
      Where 
      RL.HospitalMasterID = @Hospital 
      and 
      RL.DivisionID = @Division 
      and 
      TXNDate Between @StartDate and @EndDate) 

Select 
* 
From 
HI 

End 

SSRS를 통해이 저장 프로 시저를 실행하려고 할 때마다 변수가 정의되지 않았다는 오류가 발생합니다. 쿼리가 테스트 데이터와 함께 제대로 작동하기 때문에 SP 모드에서 잘못 처리하고있는 것이 확실합니다.

의견을 보내 주시면 대단히 감사하겠습니다.

덕분에, 스콧

+0

데이터 세트에서 명령을 설정 했습니까? 데이터 소스에 액세스 할 수 있습니까? –

답변

1

SSRS 당신의 sproc에 필요한 매개 변수 것을 감지하고 자동으로 추가 할 수 있어야합니다. 불행히도 데이터 유형을 해결할 정도로 영리하지 않으므로 수동으로 선택해야합니다.

새 데이터 세트를 선택하고 sproc을 선택하십시오. 하다. 완전한 이름을 선택하십시오. 그런 다음 필드 새로 고침을 클릭하십시오.

Sproc

당신은 당신이 수동으로 추가 할 수없는 경우 매개 변수가 추가 된 것을 볼 수 데이터 세트의 매개 변수 탭을 확인하세요. 매개 변수 이름은 대소 문자를 구분합니다.

Sproc2

마지막으로, 당신은 각각의 매개 변수 속성에 가서 수동으로 SSRS는 텍스트를 기본하므로 올바른 데이터 유형을 선택해야합니다. 화면 왼쪽의 보고서 데이터에서 매개 변수를 두 번 클릭하기 만하면됩니다.

Sproc1

NB. sproc의 어디에서나 CurDate를 사용하는 것처럼 보이지 않으므로 제거 할 수 있습니다.

+0

감사합니다. 잘 작동합니다. CurDate는 Case StartDate에 사용되며 Case EndDate는 Null입니다. 이것이 최선의 방법이 아닐 수도 있습니다. 더 좋은 것이 있다면 그것을 사용하게되어 기쁩니다. – SASUSMC

+0

@SASUSMC GETDATE()를 사용하여 sproc의 값을 설정하면 sproc로 전달할 필요가 없습니다. 또한 CASE WHEN 대신 sql ['ISNULL'] (http://technet.microsoft.com/en-us/library/ms184325.aspx) 함수를 사용할 수 있습니다. – Sam