Je dois écrire une procédure stockée pour SQL Server 2008 pour effectuer une grande requête select
et j'en ai besoin pour filtrer les résultats en spécifiant le type de filtrage via les paramètres de la procédure. J'ai trouvé quelques solutions comme ceci:Paramétrer la clause 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';
Je trouve que cette approche ne fonctionne pas. Il est possible de convertir toutes les colonnes en nvarchar(max)
et de les comparer en tant que chaînes, mais je pense que cela entraînera une dégradation des performances.
Est-il possible de paramétrer la clause where
dans la procédure stockée sans utiliser de constructions telles que EXEC sp_executesql
?
Avez-vous essayé LinQ to SQL? –