Передача нескольких значений для одного параметра SQL
У меня есть CheckBoxList, где пользователи могут выбрать несколько элементов из списка. Затем мне нужно передать эти значения в мою хранимую процедуру, чтобы их можно было использовать в условии WHERE, например:
WHERE ID IN (1,2,3)
Я попытался сделать это так, что его параметр nvarchar и я передаю строку 1,2,3 с:
WHERE ID IN (@IDs)
Но это вернуло следующую ошибку:
Conversion failed when converting the nvarchar value '1,2,3' to data type int
Любая помощь была бы очень признательна!
3 ответов:
Есть несколько способов сделать это. Вы можете передать этот параметр в виде XML blob, как в следующем примере:
CREATE PROCEDURE [dbo].[uspGetCustomersXML] @CustomerIDs XML AS BEGIN SELECT c.ID, c.Name FROM [dbo].[Customer] c JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int' ) END GO --Example Use: EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>'Или передайте значения в виде CSV и используйте функцию разделения, чтобы разделить значения в табличную переменную (там много функций разделения, быстрый поиск выведет одну).
CREATE PROCEDURE [dbo].[uspGetCustomersCSV] @CustomerIDs VARCHAR(8000) AS BEGIN SELECT c.Id, c.Name FROM [dbo].[Customer] c JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item END GO --Example Use: EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100'Если бы вы использовали SQL 2008 или более поздние версии, вы могли бы использовать табличные значения параметров, которые позволяют передавать табличную переменную в качестве параметра. Я написал в блоге об этих 3 подходит некоторое время назад, с быстрым сравнением производительности.
alter procedure c2 (@i varchar(5)) as begin declare @sq nvarchar(4000) set @sq= 'select * from test where id in (<has_i>) ' SET @sq= REPLACE(@sq, '<has_i>', @i) EXECUTE sp_executesql @sq end exec c2 '1,3'
Я нашел решение для аналогичной задачи. Он используется для управляемой данными подписки,но может быть легко изменен для использования в параметре. проверьте мой пост в блоге здесь с подробным описанием
Если у вас возникли проблемы с преобразованием его в вызов хранимой процедуры, просто дайте мне знать.
Comments