Во-первых, я бы не советовал создавать динамические операторы SQL, подобные этой ... это может сделать вас уязвимым для атак с использованием SQL-инъекций. Если вам нужно передать строку с разделенным запятыми списком, я бы вместо этого проанализировал этот список и вставил каждое отдельное значение во временную таблицу. Оттуда вы можете присоединиться к временной таблице вместо использования оператора IN
.
Однако проблема здесь в том, что вы окружаете разделенный запятыми список кавычками, поэтому вместо поиска значений H001
, D001
и F001
... он ищет одно значение равно 'H001', 'D001', 'F001'
Чтобы исправить вашу проблему, вы должны изменить свой оператор выбора на:
SELECT @SQL = @SQL+' (DEPARTMENT IN ('+@Dep+'))'
А когда вы передаете список через запятую, заключите каждое отдельное значение в кавычки в строке следующим образом:
РЕДАКТИРОВАТЬ: Изменено с назначения переменной на вызов хранимой процедуры, чтобы сделать более понятным то, что я предлагаю.
exec dbo.proc_Atnd1 '''H001'', ''D001'', ''F001'''
Что-то полезное при устранении неполадок этих типов - это PRINT
из созданного вами SQL-кода, а затем изучите его и убедитесь, что он выполняет то, что вы ожидаете.
Но опять же, я бы предложил, чтобы вы не использовали этот подход, а вместо этого изучили синтаксический анализ списка и избежали динамического SQL.