2013-05-22 3 views
2

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

select * from table where type in @list_types 

Можно ли это сделать? Или я должен использовать временные таблицы?

+0

все после 2008 года вы можете использовать http://msdn.microsoft.com/en-us/library/bb675163.aspx (параметры таблицы). В противном случае вам придется полагаться на платформу выше. Некоторое обсуждение этого можно найти здесь: http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause – Najzero

+0

Этот вопрос показывает отсутствие исследований. http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause (один из сотен) –

ответ

2

Вы можете использовать table-valued parameters. Например:

-- A table valued parameter must have a type. 
-- This command creates the type. 
create type YourType as table (type varchar(50)) 
go 
create procedure dbo.YourStoredProcedure(
    @types YourType readonly) 
as 
    select * 
    from YourTable 
    where type in (select type from @types) 
go 

Вы можете вызвать хранимую процедуру так:

declare @types YourType 
insert @types (type) values ('Type1'), ('Type2') 
exec dbo.YourStoredProcedure @types 

ADO.NET поддерживает прохождение DataTable в качестве параметра табличного значения.

1

Попробуйте один -

DECLARE @temp TABLE 
(
     [type] INT 
    , name NVARCHAR(50) 
) 

INSERT INTO @temp ([type], name) 
VALUES 
    (1, '1'), 
    (2, '2') 

DECLARE @list_types VARCHAR(30) 
SELECT @list_types = '1,3,4,5' 

;WITH cte AS 
(
    SELECT [type] = p.value('(./s)[1]', 'INT') 
    FROM (
     SELECT field = CAST('<r><s>' + REPLACE(@list_types, ',', '</s></r><r><s>') + '</s></r>' AS XML) 
    ) d 
    CROSS APPLY field.nodes('/r') t(p) 
) 
SELECT * 
FROM @temp 
WHERE [type] IN (SELECT [type] FROM cte) 
Смежные вопросы