2011-05-06 6 views
0

J'écris un proc stocké paramétré. Je sais que vous pouvez définir la valeur du paramètre de sorte qu'il affiche tous les résultats lorsque le paramètre n'est pas mentionné dans la commande d'exécution .. Mais je suis incapable de me rappeler comment cela est réalisé. Toute aide est très appréciée ... S'il vous plaît ..Processus stocké paramétré

+1

Une instruction conditionnelle est nécessaire dans la requête, mais il n'est pas recommandé de la faire dans une seule requête - pas sargable. –

+0

Je pense qu'il y a une façon dont vous pouvez définir la valeur par défaut du paramètre comme NULL ou quelque chose qui me permettra d'exec la procédure stockée sans utiliser de paramètres .. ai-je un sens .. Je ne sais pas – Avinash

+0

@OMG Poneys selon la façon dont il est écrit, vous pouvez le rendre sargable en utilisant 'OPTION RECOMPILE', non? – Matthew

Répondre

1

Vous pouvez faire vos WHERE conditions comme ceci:

WHERE (@myParam IS NULL OR @myParam = someValue) 

Vous pouvez être en mesure d'utiliser OPTION (RECOMPILE) est SQL2008SP1 + (ou similaire, ne savent pas d'autres options) dans le sproc, en fonction de votre SGBDR, pour que cela soit performant.

Méthode de Erland Sommarskog:
http://www.sommarskog.se/dyn-search-2008.html#static

À partir du lien: « L'effet de tous les @x IS clauses NULL est que si ce paramètre d'entrée est NULL, alors que ET condition est toujours Par conséquent, les seules conditions en vigueur sont celles où le paramètre de recherche a une valeur non NULL

En ce qui concerne la maintenabilité, il est difficile de trouver une meilleure solution pour les conditions de recherche actuelles. compact, facile à lire et à étendre, et très performant ood tant que vous incluez l'indicateur de requête OPTION (RECOMPILE). Cette astuce force la requête à recompilé chaque fois, auquel cas SQL Server utilisera les valeurs des variables réelles comme si elles étaient constantes. »

+0

Vous voulez dire quelque chose comme Create Proc USP_MyStoreProc Où @MyParam est NULL – Avinash

+0

@Avinash Je ne comprends pas votre commentaire. Je parle de la façon dont vous * utilisez * les paramètres à l'intérieur du sproc. – Matthew

+0

Eh bien .. Son proc de stockage simple avec une instruction select et vérifie si l'une des colonnes correspond au paramètre dans la clause Where. En outre, je veux afficher tous les résultats si aucun d'entre eux correspondent .. – Avinash

2

Je recommande sql dynamique paramétrés (sp_executesql)

aller dans cette voie, vous pouvez supprimer tout paramètre non pertinent lors de la construction de votre clause where.

Exemple de procédure:

create proc dbo.SearchForStuff 
(
@Id int = 0 
,@Description varchar(100) = '' 
) 
as 
begin 
    set nocount on; 

    declare @select nvarchar(max) = ' 
    select 
    s.* 
    from Stuff as s' 

    declare @where varchar(max) = '' 

    if isnull(@ID,0) != 0 begin     
     set @where += case @where when '' then ' where ' else ' and ' end + 's.Id = @Id'   
    end 

    if isnull(@Description,'') != '' begin  
     set @where += case @where when '' then ' where ' else ' and ' end + 's.[Description] = @Description'  
    end   

    set @select += @where 

    exec sp_executesql 
    @select 
    ,N' 
    ,@Id int = 0 
    ,@Description varchar(100) = ''''' 
    ,@Id 
    ,@Description  

end 

Utilisation:

exec SearchForStuff @Id = 1, @Description = 'omg' -- Returns every item where Id is 1 and Description is 'omg' 
exec SearchForStuff @Id = 1 -- Returns every item where Id is 1 
exec SearchForStuff @Description = 'omg' -- Returns every item where Description is 'omg' 
exec SearchForStuff --returns every item 

De cette façon votre requête finale n'est pas jonché de conditions inutiles. En outre, vous pouvez obtenir un peu plus granulaire que je l'ai fait ici. En fonction des paramètres transmis, vous pouvez personnaliser vos clauses where/join pour tirer parti de vos index afin d'obtenir les meilleures performances possibles. Le seul inconvénient est un légère perte perte de lisibilité (imo).

Questions connexes