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);
输出:
╔════╦═════════════════════════╗
║ 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,';'))
这应该适合你。
我有一个多 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);
输出:
╔════╦═════════════════════════╗
║ 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,';'))
这应该适合你。