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é
Répondre
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. »
Vous voulez dire quelque chose comme Create Proc USP_MyStoreProc Où @MyParam est NULL – Avinash
@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
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
Si c'est un int
vous pouvez utiliser
SELECT X,Y
FROM T
WHERE C BETWEEN COALESCE(@P, -2147483648) AND COALESCE(@P, 2147483647)
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).
- 1. Processus stocké avec plusieurs paramètres
- 2. Mettre en place un processus stocké SQL
- 3. Complex Inséré Processus stocké inadapté à EF?
- 4. Processus stocké avec 11+ paramètres dynamiques
- 5. Processus stocké ayant des valeurs de sortie
- 6. Code ASP pour exécuter le processus stocké
- 7. Le processus stocké n'affiche pas les résultats
- 8. Processus stocké plus lent que Management Studio
- 9. Sql Server 2008 Processus stocké récursif
- 10. Processus stocké, comment sélectionner plusieurs variables?
- 11. Comment exporter dans un fichier dans un processus stocké?
- 12. Appeler les jeux de résultats à partir d'un processus stocké
- 13. L'exécution du processus stocké à partir de la fonction UDF
- 14. SSIS: Passing record set dans un processus stocké
- 15. Processus stocké: Utiliser Retour ou Sélectionner à la fin?
- 16. Commande Oracle Uknown Erreur lors de l'exécution du processus stocké
- 17. Processus stocké à base de série basse performance
- 18. Appel asynchrone d'un processus stocké utilisant le service Broker
- 19. Processus stocké SQL dynamique vers Linq to SQL
- 20. Les lignes ne sont pas retournées dans le processus stocké
- 21. Requête SQL pour obtenir le compte dans un processus stocké
- 22. Processus stocké SQL: aide à la conversion en déclencheur
- 23. Démarrer SSIS de manière asynchrone à partir d'un processus stocké
- 24. Nombre de lignes éditées par le processus stocké
- 25. Requête dans mysql Processus stocké retournant faussement null
- 26. Problème de requête paramétré
- 27. applicationBadgeNumber non paramétré
- 28. Test paramétré dans JUnit
- 29. paramétré Hudson build issue
- 30. REST paramétré @Path
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. –
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
@OMG Poneys selon la façon dont il est écrit, vous pouvez le rendre sargable en utilisant 'OPTION RECOMPILE', non? – Matthew