Передача нескольких значений для одного параметра SQL - PullRequest
4 голосов
/ 07 января 2011

У меня есть CheckBoxList, где пользователи могут выбирать несколько элементов из списка.Затем мне нужно иметь возможность передать эти значения моей хранимой процедуре, чтобы их можно было использовать в условии WHERE, например:

WHERE ID IN (1,2,3)

Я попытался сделать это так, чтобы это был параметр nvarchar, и я передаю строку1004 * с:

WHERE ID IN (@IDs)

Но это вернуло следующую ошибку:

Conversion failed when converting the nvarchar value '1,2,3' to data type int

Любая помощь будет высоко ценится!

Ответы [ 3 ]

11 голосов
/ 07 января 2011

Есть несколько способов сделать это.Вы можете передать параметр в виде блоба XML, как в этом примере:

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 и использовать функцию split, чтобы разделить значения в табличную переменную (существует многофункции, быстрый поиск будет бросать один.)

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 или более позднюю версию, вы могли бы использовать Table Valued Parameters, которые позволяют передавать переменную TABLE в качестве параметра.Я написал в блоге об этих трех подходах некоторое время назад, с быстрым сравнением производительности.

1 голос
/ 26 мая 2011
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'
0 голосов
/ 17 июля 2013

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

Если у вас возникли проблемы с преобразованием его в вызов хранимой процедуры, просто дайте мне знать.

...