Есть ли изящный способ обработки передачи списка идентификаторов в качестве параметра хранимой процедуре?
Например, я хочу, чтобы отделы 1, 2, 5, 7, 20 возвращались моей хранимой процедурой. В прошлом я передавал список идентификаторов, разделенных запятыми, как в приведенном ниже коде, но чувствую себя действительно грязно, делая это.
Я думаю, что SQL Server 2005 - мое единственное применимое ограничение.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
Jasons
источник
источник
Ответы:
Erland Sommarskog поддерживает авторитетный ответ на этот вопрос в течение последних 16 лет: массивы и списки в SQL Server .
Существует как минимум дюжина способов передать массив или список в запрос; у каждого свои уникальные плюсы и минусы.
Я действительно не могу рекомендовать достаточно прочитать статью, чтобы узнать о компромиссах между всеми этими вариантами.
источник
Да, ваше текущее решение подвержено атакам SQL-инъекций.
Лучшее решение, которое я нашел, - это использовать функцию, которая разбивает текст на слова (их несколько опубликовано здесь, или вы можете использовать это из моего блога ), а затем присоедините их к своей таблице. Что-то вроде:
источник
Один метод, который вы можете рассмотреть, если вы собираетесь много работать со значениями, - это сначала записать их во временную таблицу. Тогда вы просто присоединитесь к нему, как обычно.
Таким образом, вы анализируете только один раз.
Проще всего использовать один из UDF-файлов «Split», но так много людей опубликовали примеры, и я подумал, что пойду другим путем;)
В этом примере будет создана временная таблица для присоединения к ней (#tmpDept) и заполнение ее идентификаторами отделов, которые вы передали. Я предполагаю, что вы разделяете их запятыми, но вы можете - конечно - изменить это все, что вы хотите.
Это позволит вам передавать один идентификатор отдела, несколько идентификаторов с запятыми между ними или даже несколько идентификаторов с запятыми и пробелами между ними.
Так что, если вы сделали что-то вроде:
Вы увидите имена всех идентификаторов отделов, которые вы передали ...
Опять же, это можно упростить, используя функцию для заполнения временной таблицы ... В основном я делал это без единой цели, чтобы просто убить скуку :-P
- Кевин Фэйрчайлд
источник
Вы могли бы использовать XML.
Например
Команда sp_xml_preparedocument встроена.
Это даст результат:
который имеет все (больше?) того, что вам нужно.
источник
Сверхбыстрый метод XML, если вы хотите использовать хранимую процедуру и передать список идентификаторов отделов через запятую:
Вся заслуга в блоге Гуру Брэда Шульца
источник
Попробуй это:
очень просто.
источник