Я чувствую вашу боль, у нас была та же проблема при использовании SSRS с SP.Вам действительно нужно разделить значения, которые вы передаете в хранимую процедуру.
В вашей хранимой процедуре SQL ожидает;
Alias.Field1 IN (@RC)
, который компилируется до
Alias.Field1 IN ('Value1','Value2,'Value3')
Тем не менее, SSRS передаст значения параметров в виде одной длинной строки (почему MS сделал это за меня) и в итоге получит это
Alias.Field1 IN ('Value1,Value2,Value3')
Который, как вы правильно указали, имеет нулевой контрольнад.Поэтому вам нужно использовать функцию Split Strings.Об этом Аарон Бертран написал отличный пост в блоге SQLPerformance.com , в котором рассказывается о плюсах и минусах каждого метода в зависимости от размера вашей базы данных.Мы использовали SplitStrings CTE, поскольку он дал наилучшую производительность для размера большинства наших БД.
Вот функция;
CREATE FUNCTION [dbo].[fn_SplitStringsCTE]
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS @Items TABLE (Item NVARCHAR(4000))
WITH SCHEMABINDING
AS
BEGIN
DECLARE @ll INT = LEN(@List) + 1, @ld INT = LEN(@Delimiter);
WITH a AS
(
SELECT
[start] = 1,
[end] = COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, 1), 0), @ll),
[value] = SUBSTRING(@List, 1,
COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, 1), 0), @ll) - 1)
UNION ALL
SELECT
[start] = CONVERT(INT, [end]) + @ld,
[end] = COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, [end] + @ld), 0), @ll),
[value] = SUBSTRING(@List, [end] + @ld,
COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, [end] + @ld), 0), @ll)-[end]-@ld)
FROM a
WHERE [end] < @ll
)
INSERT @Items SELECT [value]
FROM a
WHERE LEN([value]) > 0
OPTION (MAXRECURSION 0);
RETURN;
END
GO
А вот как вы реализуете ее в своем хранилищеПроцедура;
AND (Alias.Field1 IN (SELECT Item FROM [dbo].[fn_SplitStringsCTE](@RC,',')))
Что касается передачи значений NULL в хранимую процедуру, мы тоже хотели это сделать, но вместо этого решили использовать следующее, а затем добавить значение в свой параметр SSRS, который передает «Все значения».', это была хорошая ловушка для нас, когда мы хотели вернуть все значения этого параметра, но если у вас есть NULL в вашем наборе данных, они также должны быть обработаны.
AND (@RC = 'All Values' OR Alias.Field1 IN (SELECT Item FROM [dbo].[fn_SplitStringsCTE](@RC,',')))