2013-11-25 40 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

如果检查数据集的参数标签,你应该看到您的参数已经添加,如果没有,那么你可以手动添加。请记住,参数名称区分大小写。

Sproc2

最后,你必须进入每个参数的属性和手动选择正确的数据类型为SSRS将默认为文本。只需双击屏幕左侧的报告数据中的参数即可。

Sproc1

NB。你似乎没有在你的sproc中的任何地方使用CurDate,所以你可以删除它。

+0

谢谢,它运作良好。 CurDate用于Case StartDate和Case EndDate为空。这可能不是最好的办法。如果有更好的,我会很乐意使用它。 – SASUSMC

+0

@SASUSMC在使用GETDATE()设置存储区中的值时,不需要将其传递到存储区。你也可以使用sql ['ISNULL'](http://technet.microsoft.com/en-us/library/ms184325.aspx)函数而不是CASE WHEN。 – Sam