Многозначные параметры в хранимой процедуре возвращают ошибки, когда им передаются несколько значений - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю хранимую процедуру, которая использует два многозначных параметра:

@Class AS VARCHAR(5),
@Service AS VARCHAR(5)
(…)    
WHERE B.UTRCLS IN (@Class) AND B.UTSVC IN (@Service)

Процедура работает нормально, когда оба параметра содержат только одно значение. Однако когда одно или оба используют несколько значений, выдается ошибка.

В построителе отчетов ошибка следующая:

Невозможно прочитать следующую строку данных для набора данных DataSet1 (rsErrorReadingNextDataRow)

В SQL Server ошибка выглядит следующим образом (сокращено по длине):

Невозможно выполнить запрос "SELECT Col1009, Col1010, Col1008, Expr1003, Expr1004 ОТ (ВЫБРАТЬ Col1009, Tbl1001.UTCSNM Col1008, Col1010, SUM (Col1016) Expr1003, SUM (Col1014) Expr1004 ОТ (…)

Не думаю, что я делаю что-то не так с объявлением параметров. Это проблема с многозначными параметрами в хранимых процедурах?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Комментарии к вашему сообщению находятся на правильном пути.Параметры имеют одно значение для контекста вызова хранимой процедуры, а не повторяются для наборов значений параметров.Я думаю, у вас есть 2 варианта, если вы хотите передать много значений в эти параметры.

Первое - это расширить длину символов ваших параметров и включить разделитель для сегментирования значений.Код вашей хранимой процедуры должен был бы затем проанализировать эти значения и сделать то, что нужно для каждого из них.Функция STRING_SPLIT () поможет вам в этом.

Второй вариант - определить пользовательский тип данных таблицы типов, которая отражает структуру данных из нескольких значений, которые необходимо передать в параметре.При вызове хранимой процедуры вы определяете переменную этого типа, заполняете ее значениями и затем передаете эту переменную в вашу хранимую процедуру.Обратите внимание, что для этого необходимо установить значение ТОЛЬКО ЧТЕНИЕ.

Ссылка на MSDN для создания пользовательских типов: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql?view=sql-server-2017

0 голосов
/ 09 апреля 2019

Вам необходимо использовать динамический запрос:

SET @sqlCommand = 'SELECT * FROM yourTable B WHERE B.UTRCLS IN ( +' @Class + ')' +
                  ' AND B.UTSVC IN (' + @Service +' )'

EXECUTE sp_executesql @sqlCommand
...