Potrzebuję napisać procedurę przechowywaną dla SQL Server 2008 do wykonania dużego zapytania select
i potrzebuję go do filtrowania wyników z określeniem typu filtrowania za pomocą parametrów procedury. Znalazłem kilka takich rozwiązań:Parametryzować klauzulę WHERE?
create table Foo(
id bigint, code char, name nvarchar(max))
go
insert into Foo values
(1,'a','aaa'),
(2,'b','bbb'),
(3,'c','ccc')
go
create procedure Bar
@FilterType nvarchar(max),
@FilterValue nvarchar(max) as
begin
select * from Foo as f
where case @FilterType
when 'by_id' then f.id
when 'by_code' then f.code
when 'by_name' then f.name end
=
case @FilterType
when 'by_id' then cast(@FilterValue as bigint)
when 'by_code' then cast(@FilterValue as char)
when 'by_name' then @FilterValue end
end
go
exec Bar 'by_id', '1';
exec Bar 'by_code', 'b';
exec Bar 'by_name', 'ccc';
Zauważyłem, że to podejście nie działa. Możliwe jest rzutowanie wszystkich kolumn na nvarchar(max)
i porównywanie ich jako łańcuchów, ale myślę, że spowoduje to pogorszenie wydajności.
Czy można parametryzować klauzulę where
w procedurze przechowywanej bez użycia takich konstrukcji jak EXEC sp_executesql
?
Czy próbowałeś LinQ do SQL? –