我有一个多选参数,它的列表上有逗号,我的数据集正在使用函数拆分我的参数,因为它在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”下获得记录。
有人可以就如何解决这个问题提出想法吗?任何回复都将不胜感激。
答案 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。