SSRS多选参数无法使用逗号捕获值

时间:2016-05-06 11:03:04

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

我有一个多选参数,它的列表上有逗号,我的数据集正在使用函数拆分我的参数,因为它在SP中,所以我的where子句看起来像这样:

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT VALUE FROM DBO.FnSplit(@ProductDivision,','))

例如,在多选参数中勾选“SMART-UPS 1,5KVA”和“BACK-UPS”,多选将把第一个值视为两个不同的值,即“SMART-UPS 1” “和5KVA”。所以在我的分割功能中它会显示这个结果:

  Row Value
   1  SMART-UPS 1
   2  5KVA
   3  BACK-UPS

由于“SMART-UPS 1”和“5KVA”不是有效值,我不会在“SMART-UPS 1,5KVA”下获得记录。

有人可以就如何解决这个问题提出想法吗?任何回复都将不胜感激。

4 个答案:

答案 0 :(得分:1)

您应该将值存储在单独的表中。显示描述并将列表项的值设为各自的ID。然后,你的字符串参数中永远不会有逗号。

如果那不是一个选项:

在构建字符串之前(在应用程序中),将所有逗号值替换为您不知道自然会出现的内容。

例如,如果您选择了以下值:

 1. SPK,5
 2. Joe
 3. Dave,Smith

你可以迭代这些项目并用十个星号替换逗号:“**********”

所以你的最后一个字符串是“SPK ********** 5,Joe,Dave ********** Smith”。您还希望将替换字符串作为第二个参数传递(这样您就可以在不修改SP的情况下更改应用程序)。

然后,您可以使用以下逻辑:

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT REPLACE(VALUE, @SecondParameter, ',') FROM DBO.FnSplit(@ProductDivision,','))

这样,所有内容都会被正确分割,因为您已删除了逗号。然后,当您从该列表中选择时,您只需用原始逗号替换有趣的字符串(在此示例中为十个星号)。

为了记录,你应该100%做我最初建议的。这是一种可怕的方法,但它会让你摆脱困境。

答案 1 :(得分:1)

这个问题的答案可以很简单:只需使用不同的分隔符即可! (在这种情况下,我使用";"但您几乎可以使用任何符号,这些符号不会出现在您的LOV中。

传递参数时,将数据集属性中的参数值设置为

=Join(Parameters!ProductDivision.Value, ";")

在您的SQL代码中,然后将where子句调整为

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT VALUE FROM DBO.FnSplit(@ProductDivision,';'))

这应该适合你。

答案 2 :(得分:0)

您可以将参数作为表参数传递:

CREATE TABLE #t(ID INT IDENTITY(1,1), CURRENTPRODATT_DIV_NAME VARCHAR(100));

INSERT INTO #t(CURRENTPRODATT_DIV_NAME)
VALUES ('SMART-UPS 1,5KVA'), ('BACK-UPS');


DECLARE @t TABLE (val VARCHAR(100));
INSERT INTO @t(val) VALUES ('SMART-UPS 1,5KVA'),('BACK-UPS');

SELECT *
FROM #t
WHERE CURRENTPRODATT_DIV_NAME IN (SELECT val FROM @t);

LiveDemo

输出:

╔════╦═════════════════════════╗
║ ID ║ CURRENTPRODATT_DIV_NAME ║
╠════╬═════════════════════════╣
║  1 ║ SMART-UPS 1,5KVA        ║
║  2 ║ BACK-UPS                ║
╚════╩═════════════════════════╝

答案 3 :(得分:0)

所以我猜你传递的字符串是一个字符串,如param,value,param,value,你只需要字符串中的值。

如果你知道价值不能是'PARAMETER'。你可以这样做

declare @params varchar(max) = 'PARAMETER1,AAA,PARAMETER2,BBB'

SELECT VALUE  FROM dbo.FnSplit(@params,',')
WHERE VALUE  NOT LIKE 'PARAMETER%'

此查询的输出是

----------
AAA
BBB

编辑:

如果您将参数作为值,并且您知道始终存在param,value,param,value字符串。你可以使用CTE

declare @params varchar(max) = 'PARAMETER1,AAA,PARAMETER2,BBB'; 
WITH VALUE AS
(
    SELECT VALUE, ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) as RN 
    FROM dbo.FnSplit(@params,',')
)

SELECT * FROM VALUE
WHERE RN % 2 = 0

那么你在这里做什么,你拆分字符串并保存rownumber,你也知道值总是有一个Rownumber。