Ответ 1
Правильно, мне нужно дать вам немного земли 1-го.
Если вы разрешаете параметру SSRS выбирать несколько значений, выбор нескольких значений создает строку с разделителями с запятой в виде одной строки
'value1,value2,value3'
Чтобы проверить значения в строке с помощью оператора IN
, нам нужны строки, конкатенированные запятыми, что-то вроде этого....
'value1','value2','value3'
Ваш Proc
Теперь в вашем proc, когда вы вставляете значения явно, он вставляет в таблицу несколько значений.
INSERT INTO Table_Value_Param
VALUES ('value1'), --<-- 1st value/Row
('value2'), --<-- 2nd Value/Row
('value3') --<-- 3rd Value/Row
и это возвращает ожидаемые результаты, так как внутри вашей процедуры вы выполняете инструкцию типа
SELECT *
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName
FROM Table_Value_Param)
С другой стороны, когда вы пытаетесь вставить в таблицу с помощью отчета SSRS Параметр, вы вставляете таблицу как
INSERT INTO Table_Value_Param
VALUES ('value1,value2,value3') --<-- One Row/Value containing all the values comma separated
Решение
Создание TVP
в этой ситуации действительно не помогает, то, что я делаю, использует функцию dbo.Split()
внутри моей процедуры.
Вы можете найти множество определений для функции split в Интернете, для некоторых классных смотрите здесь Split Function equivalent in tsql?
Как только вы создали эту функцию split, просто используйте эту функцию внутри вашего определения процедуры, тогда вам даже не нужны параметры, соответствующие таблице.
Что-то вроде этого...
SELECT *
FROM Table_Name
WHERE ColumnName IN (
SELECT Value
FROM dbo.Split(@Report_Param, ',')
)