创建要在SSRS中使用的变量存储过程

时间:2013-11-25 22:51:35

标签: variables stored-procedures reporting-services

我正在尝试创建一个引用SSRS变量输入的存储过程。这是复杂查询的代码。我正在使用CTE来使代码更具可读性。

    /****** 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模式下我有一些错误的做法,因为查询可以与测试数据一起正常工作。

任何建议都将不胜感激。

谢谢, 斯科特

1 个答案:

答案 0 :(得分:1)

SSRS应该能够检测您的sproc需要的参数并自动添加它们。不幸的是,它不够聪明,无法计算数据类型,所以你必须手动选择这些。

选择一个新数据集并选择sproc。使。确保选择完全限定名称。然后单击“刷新字段”按钮。

Sproc

如果选中数据集的“参数”选项卡,则应该看到已添加参数,如果没有,则可以手动添加它们。请记住,参数名称区分大小写。

Sproc2

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

Sproc1

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