【问题标题】:Pass Int array to SQL Server stored procedure for a Select statement将 Int 数组传递给 SQL Server 存储过程以获取 Select 语句
【发布时间】:2020-12-14 13:04:17
【问题描述】:

我有一个从存储过程运行的 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

从查询中调用存储过程是可行的,但是发送数组是个问题:

DECLARE @ProductiveUnitID int
SET @ProductiveUnitID = (44)

EXEC [dbo].[CostDriverIdentification] @ProductiveUnitID

【问题讨论】:

    标签: sql-server stored-procedures reporting-services


    【解决方案1】:

    您不能将整数数组从 SSRS 发送到存储过程。

    改为使用带有参数数字的字符串。使用管道分隔数字

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

    ="|" & JOIN(Parameters.INT.Value, "|") & "|" 
    

    这将创建一个类似的字符串

    |1|2|3|4|
    

    然后在 WHERE 中使用 CHAR_INDEX 检查 ID:

    AND CHARINDEX('|' + CAST(ProdUnitID as varchar(50)) + '|', @ProductiveUnitID) > 0 
    

    这将在 ID 周围添加管道并检查字符串参数以进行比较:

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

    如果未找到 ID,CHARINDEX 将返回零,从而使 AND 子句为 FALSE。

    How to pass an array into a SQL Server stored procedure

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多