Как передать параметр множественных значений в процедуру

Я хочу передать параметр множественных значений в свою процедуру и использовать его в качестве фильтра. Мой параметр называется @Month, а тип данных в процедуре — NVARCHAR(MAX). Я использовал фильтр как

WHERE (cal.CalendarYear = @Year) AND (cal.MonthId IN (@Month))

а также попробовал функцию STRING_SPLIT. Однако, когда я запускаю свой отчет, он возвращает ошибку Преобразование не удалось при преобразовании значения nvarchar '1,2,3,4,5,6,7,8,9,10,11,12' в тип данных int. введите здесь описание изображения


person Community    schedule 11.07.2017    source источник
comment
Вместо этого используйте переменную TABLE для передачи значений в виде строк.   -  person TT.    schedule 11.07.2017
comment
См. мой ответ на предыдущий связанный вопрос. Это может сэкономить вам много работы. stackoverflow.com/questions/45012713/   -  person Alan Schofield    schedule 11.07.2017


Ответы (1)


вы не можете указать строку varchar со значениями, разделенными запятыми, и ожидать, что запрос обработает ее как список «в». Это сработает, если вы соедините свой оператор sql в хранимой процедуре, а затем выполните строку sql с помощью sp_executesql. Использование string_split — один из способов сделать это, но вы должны знать, что он дает вам таблицу с varchars, а не с целыми числами. Для полноты картины я должен упомянуть, что наиболее «надежный» способ сделать это — передать переменную табличного типа в вашу хранимую процедуру, как описано здесь: Как передать параметры табличного значения в хранимую процедуру из кода .net. С split_string вы можете попробовать что-то вроде этого:

select
 -- your fields
from
    manytables mt
    join string_split(@Month,',') months on cast(months.value as int) = cal.monthId
where 
    cal.Calenderyear = @year
person nico boey    schedule 11.07.2017