Dynamic SQL перечислены в некоторые из ответов, безусловно, решение. Однако, если нужно избегать динамического SQL, одним из решений, которые я предпочитаю, является использование табличных переменных (или временных таблиц) для хранения значения параметра, которое используется для сравнения в предложении WHERE.
Ниже приведен пример реализации хранимой процедуры.
CREATE PROCEDURE [dbo].[myStoredProc]
@parameter1 varchar(50)
AS
declare @myTempTableVar Table(param1 varchar(50))
insert into @myTempTableVar values(@parameter1)
select * from MyTable where MyColumn in (select param1 from @myTempTableVar)
GO
В случае, если вы хотите передать в несколько значений, то разделенные запятыми значения могут быть сохранены в виде строк в табличной переменной и используется таким же образом, для сравнения.
CREATE PROCEDURE [dbo].[myStoredProc]
@parameter1 varchar(50)
AS
--Code Block to Convert Comma Seperated Parameter into Values of a Temporary Table Variable
declare @myTempTableVar Table(param1 varchar(50))
declare @index int =0, @tempString varchar(10)
if charindex(',',@parameter1) > 0
begin
set @index = charindex(',',@parameter1)
while @index > 0
begin
set @tempString = SubString(@parameter1,1,@index-1)
insert into @myTempTableVar values (@tempString)
set @parameter1 = SubString(@parameter1,@index+1,len(@parameter1)[email protected])
set @index = charindex(',',@parameter1)
end
set @tempString = @parameter1
insert into @myTempTableVar values (@tempString)
end
else
insert into @myTempTableVar values (@parameter1)
select * from MyTable where MyColumn in (select param1 from @myTempTableVar)
GO
Зачем вам это нужно? Вы не получаете ни одной из преимуществ хранимой процедуры со всей ценой. –
Я думаю, что это не очень полезно для хранимой процедуры. Амир дает вам возможность, но в вашем случае я думаю, что буду использовать представление. – DomreiRoam
Джоэл и Джефф рассказывают о параметризации SQL в подкасте 31. https://stackoverflow.fogbugz.com/default.asp?W26423 –