我有一个报告,当在SQL中运行时,使用多值参数可以毫无问题地提取数据。当应用于存储过程并通过SSRS处理并在选择多个值时启用“允许多值”时,报表不返回任何数据。与其他用户一样,如果我选择单个值,报表将返回数据。
我做了一些功课并尝试增加我的参数值,但这也无济于事。
请参阅下面的查询。有问题的参数是@material参数。
With Zone as
(Select
name,
id
From datex_Footprint.LocationContainersView
Where
typename IN ('Zone', 'Area')
)
SELECT inv.projectId,
inv.projectName,
inv.materialLookupCode,
inv.materialDescription,
CASE
WHEN sn.id IS NULL
THEN inv.totalPackagedAmount
ELSE 1
END AS totalPackagedAmount,
inv.licensePlateLookupCode,
z.name WarehouseZone,
inv.locationName,
sn.id serialNumberId,
sn.lookupCode,
udf.SerialRef1,
udf.SerialRef2,
udf.SerialRef3,
udf.SerialRef4,
udf.SerialRef5
FROM datex_footprint.InventoryDetailedViewByLicensePlateLot inv
LEFT OUTER JOIN datex_footprint.SerialNumbers sn ON sn.lotId = inv.lotId
AND sn.licensePlateId = inv.licensePlateId
AND sn.archived = 'False'
LEFT OUTER JOIN datex_footprint.SerialNumbersUdfs udf ON udf.id = sn.id
INNER JOIN datex_footprint.LocationContainersView lcv ON lcv.id = inv.locationId
INNER JOIN datex_footprint.locationcontainers LC ON LC.id = lcv.id
INNER JOIN Zone z ON z.id = LC.parentid
WHERE inv.projectName IN(@projectName)
AND inv.materialLookupCode IN(@material)
AND (inv.locationName IN(@locationName)
OR (@locationName IS NULL));
答案 0 :(得分:0)
如果您不必使用存储过程,那么解决此问题的最简单方法是将此代码直接放入数据集中。它将按预期工作,SSRS会将多值参数转换为逗号分隔列表并将其注入SQL语句。
如果必须使用存储过程,则需要自己进行所有转换,包括在存储过程中拆分值。有很多关于如何执行此操作的示例,例如http://www.codeulike.com/2012/03/ssrs-multi-value-parameters-with-less.html
就个人而言,我总是将数据集代码直接放在数据集查询中,它更方便,意味着SQL服务器上的对象更少但安全性更低。