Sql server 为Select语句将Int数组传递给SQL Server存储过程
我有一个从存储过程运行的SQL Server Reporting Services报表。我想将报告中的一个参数发送到此存储过程以进行筛选。参数应为int数组。请告知如何执行此操作?如何发送Int数组?到目前为止,存储过程: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
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