Sql server 为Select语句将Int数组传递给SQL Server存储过程

Sql server 为Select语句将Int数组传递给SQL Server存储过程,sql-server,stored-procedures,reporting-services,Sql Server,Stored Procedures,Reporting Services,我有一个从存储过程运行的SQL Server Reporting Services报表。我想将报告中的一个参数发送到此存储过程以进行筛选。参数应为int数组。请告知如何执行此操作?如何发送Int数组?到目前为止,存储过程: ALTER PROCEDURE [dbo].[CostDriverIdentification] @ProductiveUnitID Int AS BEGIN SET NOCOUNT ON; DECLARE @CountPUIDs int

我有一个从存储过程运行的SQL Server Reporting Services报表。我想将报告中的一个参数发送到此存储过程以进行筛选。参数应为int数组。请告知如何执行此操作?如何发送Int数组?到目前为止,存储过程:

ALTER PROCEDURE [dbo].[CostDriverIdentification] 
    @ProductiveUnitID Int
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @CountPUIDs int

    SET @CountPUIDs = COUNT(@ProductiveUnitID)

    SELECT @CountPUIDs

    SELECT 
        dbo.View_ProdUnit.ProdUnitID, dbo.View_ProdUnit.ProdUnitNo, 
        dbo.View_ProdUnit.PU_Text, dbo.View_ProdUnit.PUGroup, 
        dbo.View_ProdUnit.CompanyID, dbo.View_ProdUnit.UserGroupID, 
        dbo.View_PivotWOCCCost.ComponentCodeID, 
        dbo.ComponentCode.C_Code + ' - ' + dbo.ComponentCode.CC_Text AS ComponentCode, 
        dbo.View_PivotWOCCCost.ActivityTypeID AS WO_AT, 
        dbo.ActivityType.ATCode, dbo.View_PivotWOCCCost.ForecastItemID, 
        dbo.View_FCI_LCM.FCI_text, dbo.Package.PackageNo, 
        dbo.View_PivotWOCCCost.CountOfWONumber, 
        ROUND(dbo.View_PivotWOCCCost.AvgWOCost, 2) AS AvgWOCost,  
        ROUND(dbo.View_PivotWOCCCost.TotSpend, 2) AS TotSpend, 
        dbo.View_FCI_LCM.LCMName, dbo.View_FCI_LCM.LCMItemID, 
        dbo.View_FCI_LCM.First, dbo.View_FCI_LCM.Frequency, 
        dbo.View_FCI_LCM.PartsCost, dbo.View_FCI_LCM.LabourCost, 
        dbo.View_FCI_LCM.MiscCost, dbo.View_FCI_LCM.TotalCost, 
        dbo.View_ProdUnit.ProdUnitLifeLeft, dbo.View_ProdUnit.ProdUnitLifeUsed, 
        dbo.View_ProdUnit.ProdUnitLifeUsed / dbo.View_PivotWOCCCost.CountOfWONumber AS ActualFrequency, 
        ROUND(dbo.View_FCI_LCM.ItemRate, 2) AS LCMItemRate, 
        ROUND(dbo.View_PivotWOCCCost.TotSpend / dbo.View_ProdUnit.ProdUnitLifeUsed, 2) AS ActItemRate, 
        CASE 
           WHEN View_FCI_LCM.ItemRate IS NULL 
              THEN ROUND(View_PivotWOCCCost.TotSpend / View_ProdUnit.ProdUnitLifeUsed, 2) 
              ELSE Round(Abs(View_FCI_LCM.ItemRate - View_PivotWOCCCost.TotSpend / View_ProdUnit.ProdUnitLifeUsed), 2) 
        END AS RateVar, 
        ParentCC.C_Code AS CompCodeCostGroup, 
        ParentCC.CC_Text AS CompCodeCostGroup_Text, 
        (dbo.View_ProdUnit.ProdUnitLifeUsed / dbo.View_PivotWOCCCost.CountOfWONumber ) / @CountPUIDs as AverageFreq
    FROM     
        dbo.Package 
    INNER JOIN
        dbo.View_PivotWOCCCost ON dbo.Package.ID = dbo.View_PivotWOCCCost.PackageID 
    INNER JOIN
        dbo.View_ProdUnit ON dbo.View_PivotWOCCCost.ProductiveUnitID = dbo.View_ProdUnit.ProdUnitID 
    INNER JOIN
        dbo.ComponentCode ON dbo.View_PivotWOCCCost.ComponentCodeID = dbo.ComponentCode.ID 
    INNER JOIN
        dbo.ActivityType ON dbo.View_PivotWOCCCost.ActivityTypeID = dbo.ActivityType.ATID 
    LEFT OUTER JOIN
        dbo.ComponentCode AS ParentCC ON dbo.ComponentCode.CC_CostGroupID = ParentCC.ID 
    LEFT OUTER JOIN
        dbo.View_FCI_LCM ON dbo.View_PivotWOCCCost.ForecastItemID = dbo.View_FCI_LCM.FCI_ID
    WHERE  
        (dbo.View_ProdUnit.ProdUnitLifeUsed <> '0') 
        AND dbo.View_ProdUnit.ProdUnitID = @ProductiveUnitID
END

不能从SSR向存储过程发送整数数组

相反,使用带有参数编号的字符串。使用管道来分隔数字

使用参数值传递SSRS报告中的值:

="|" & JOIN(Parameters.INT.Value, "|") & "|" 
这将创建一个类似

|1|2|3|4|
然后在其中使用CHAR_索引检查ID:

AND CHARINDEX('|' + CAST(ProdUnitID as varchar(50)) + '|', @ProductiveUnitID) > 0 
这将在ID周围添加管道,并检入字符串参数进行比较:

AND CHARINDEX('|2|', '|1|2|3|4|') > 0 
如果找不到ID,CHARINDEX将返回零,使AND子句为FALSE

AND CHARINDEX('|2|', '|1|2|3|4|') > 0