Sql 具有多选参数的分隔符字符

Sql 具有多选参数的分隔符字符,sql,string,csv,reporting-services,Sql,String,Csv,Reporting Services,我使用SSRS将multi-select参数传递给存储过程,为此,我在下面的存储过程相关行中使用了字符串拆分函数 ALTER PROCEDURE [dbo].[GetPerformance] ( @ItemName varchar(max) ) ... SELECT Item INTO #ItemNames FROM dbo.DelimitedSplit8K(@ItemName,','); SELECT * FROM SomeTable WHERE ItemName IN(SELECT It

我使用SSRS将multi-select参数传递给存储过程,为此,我在下面的存储过程相关行中使用了字符串拆分函数

ALTER PROCEDURE [dbo].[GetPerformance] (
@ItemName varchar(max)
)
...

SELECT Item
INTO #ItemNames
FROM dbo.DelimitedSplit8K(@ItemName,',');

SELECT * FROM SomeTable
WHERE ItemName IN(SELECT Item FROM #ItemNames)
这很好,直到列表中的一个项目包含逗号,我才得到结果。Ie:如果在我的SSRS报告中,用户选择以下项目:

Apples
Bananas
Grapes, Strawberries, and Melons
Oranges
在存储过程中,我以以下内容结束:

Apples
Bananas
Grapes
Strawberries
and Melons
Oranges

并且排除所有相关行。有没有办法更改SSRS join multi select参数使用的字符?

我认为您最好将下拉列表值中的逗号替换为其他字符,比如分号。通过在运行时对数据进行替换,也可以在存储过程中处理该问题。这是阻力最小的路径

用于填充下拉列表的SQL:

SELECT DISTINCT REPLACE(ItemName, ',', ';') AS ItemName FROM SomeTable
存储过程更改:

ALTER PROCEDURE [dbo].[GetPerformance] (
@ItemName varchar(max)
)
...
SELECT Item
INTO #ItemNames
FROM dbo.DelimitedSplit8K(@ItemName,',');

SELECT * FROM SomeTable
WHERE REPLACE(ItemName, ',', ';') IN (SELECT Item FROM #ItemNames)
或者,只需从数据中删除逗号即可。如果可以的话,将该类别改为其他类别。可能不是最理想的选择,但是如果您能够说服数据所有者进行更改,那么您就不必担心更改报告


in子句列表中的逗号是通用的。如果可能的话,更改SSRS中的分隔符会破坏使用in子句但不使用存储过程的报告。

我通过使用ItemID而不是名称解决了这个问题@R.Richard关于双引号/替换逗号的回答可能有效,但使用Id似乎更符合逻辑。

我同意,使用Id是首选选项。 但有时您别无选择,只能在数据值本身中使用带有逗号的数据项。 在这种情况下,考虑将列表中的每个项目用双引号之类的限定符包装。 然后调整分割例程以处理限定符。 因此,我提供参数的代码如下所示:

Select Label = myField, Value = '"' + myField + '"' From myTable;
我的分割函数看起来像

Create Function fn_SSRS_Split
    (@Parameters Varchar(Max), @Qualifier varchar(10))
    Returns @Result Table (Value varchar(8000))
As
Begin
    Declare @Value Varchar(Max), @Pos Int
    Declare @Search Varchar(10), @SearchLength Tinyint, @QualifierLength Tinyint;

    -- Default Delimiter and Qualifier parameters if blank or null
    Set @Delimiter          = IsNull(NullIf(@Delimiter, ''), ',');
    Set @Qualifier          = IsNull(NullIf(@Qualifier, ''), '"');
    Set @QualifierLength    = DataLength(@Qualifier)
    Set @Search             = @Qualifier + @Delimiter;
    Set @SearchLength       = Len(@Search);

    Set @Parameters         = @Parameters + @Delimiter

    Set @Pos = CharIndex(@Search, @Parameters, 1)

    While @Pos > 0 
    Begin
            Set @Value = Right(Left(@Parameters, @Pos - (@SearchLength - 1)), @Pos - ((@SearchLength - 1) * 2))
            If @Value <> ''
                Insert Into @Result (Value) Values (@Value) 
            Set @Parameters = SubString(@Parameters, @Pos + @SearchLength, DataLength(@Parameters) - @Pos - 1)
            Set @Pos = CharIndex(@Search, @Parameters, @SearchLength)
    End 
    Return
End

谢谢,这看起来是可行的,但我选择了使用IDs。事件更好!很好,这是一个选择。有时,您只有一个描述字段。