SSRS multi-select 参数无法捕获带逗号的值

SSRS multi-select parameter can't capture values with comma

我有一个多 select 参数,它的列表中有逗号,我的数据集正在为我的参数使用函数拆分,因为它在 SP 中,所以我的 where 子句如下所示:

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

例如,在multi-select参数中勾选了"SMART-UPS 1,5KVA"和"BACK-UPS",multi-select会将第一个值视为两个不同的值这是 "SMART-UPS 1" 和 5KVA”。所以在我的 Split 函数中它会显示这个结果:

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

而且由于 "SMART-UPS 1" 和 "5KVA" 不是有效值,我不会得到 "SMART-UPS 1,5KVA" 下的记录。

有人可以提供有关如何解决此问题的想法吗?任何回复将不胜感激。

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

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                ║
╚════╩═════════════════════════╝

所以我猜你传递的字符串是一个类似 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

编辑:

如果您将参数作为值,并且您知道总会有参数、值、参数、值字符串。你可以使用 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

那么您在这里所做的就是拆分字符串并保存行号,并且您还知道值将始终具有偶数行号。

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

如果这不是一个选项:

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

例如,如果您select编辑了以下值:

 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,','))

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

郑重声明,您应该 100% 执行我最初的建议。这是一种糟糕的方法,但它会让你摆脱困境。

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

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

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

在你的 SQL-Code 中,然后将 where 子句调整为

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

这应该适合你。