【问题标题】:SSRS multi-select parameter can't capture values with commaSSRS 多选参数无法用逗号捕获值
【发布时间】:2016-05-06 11:03:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 可能是将值存储在带有 ID 的单独表中并将 ID 传递到存储过程而不是文本值的好理由

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


【解决方案1】:

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

传递Parameters时,将Dataset Properties中的Paramter Value设置为

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

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

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

这应该适合你。

【讨论】:

  • 哇,这就像一个魅力!非常感谢莫西!
  • 没问题,我隔天用这个方法
【解决方案2】:

您应该将值存储在单独的表中。显示描述并将列表项的值设为各自的 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% 做我最初建议的事情。这是一种糟糕的方法,但它会让你摆脱困境。

【讨论】:

  • 感谢您花时间回答我的问题。我很感激。不过,我找到了一个更简单的解决方案。这是来自莫西的回应。
  • @Aldrin 没问题,虽然他的回答和我的一样,只是更容易出错。从我的回答“用你知道不会自然出现的东西替换所有逗号值”。十个星号就是一个例子。如果分号不会自然出现,那也是一样的。但是,您最好将其作为参数传递,因为如果您的列表中包含一个带有分号的选项(如果这是您选择的分隔符),那么您将不得不同时修改应用程序和 SP,而不仅仅是一个.祝你好运,无论如何。
【解决方案3】:

所以我猜你传递的字符串是一个像 param,value,param,value 这样的字符串,而你只想要字符串中的值。

如果您知道值不能是“参数”。你可以这样做

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

所以你在这里做什么,你分割字符串并保存行号,你也知道值总是有一个偶数行号。

【讨论】:

  • 感谢您的回复,如果我的帖子令人困惑,请见谅。我想得到的值是“PARAMETER1,AAA”,只有 1 个字符串,而不是将它们分成 2 个。我将编辑我的帖子并给出其他示例。
  • @Aldreenzy 以及 SQL 如何知道哪个 ',' 适合拆分,哪个不适合。据我了解,您的值可以包含逗号,但是 SQL 无法知道什么是 ',' 是拆分器,哪个不是。您要么使用不同的拆分器,要么提出一种算法来告诉您一个逗号是或不是拆分器。
  • 是的,正确。所以我真的必须调整我的拆分功能。感谢您的建议。
【解决方案4】:

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

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

【讨论】:

  • 很抱歉给您带来了困惑。我编辑了我的示例以更清楚地解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多