i peut exécuter une procédure stockée pour une seule valeur facilement: mais comment puis-je exécuter les mêmes stockés pour de nombreuses valeurs, que j'ai dans une liste (j'ai une virgule séparée la liste d'environ 1000 valeurs constantes, qui venaient de l'extérieur de SQL). p> Je pensais quelque chose dans les lignes de: p> éditer: puisque je Ne pas avoir des autorisations pour modifier cette procédure ou faire de nouvelles procédures stockées à cette base de données, je préférerais résoudre ce problème au niveau de la requête plutôt que de demander à quelqu'un de faire les changements nécessaires pour moi. P> P>
4 Réponses :
Vous devez prendre le paramètre en tant que chaîne séparée par des virgules en procédure stockée, puis Vérifiez à l'intérieur de la procédure stockée forte> Si vous utilisez pour diviser la chaîne à l'intérieur de la procédure stockée: p> NB! strong> Soyez prudent avec des espaces blancs lorsque vous utilisez ci-dessus split_string () code>. p>
Splitstring code> Fonction. Pour des valeurs telles que
IF (@ID IN (SELECT RTRIM(LTRIM([Name])) FROM dbo.splitstring(@CommaSeparatedString))
Je préférerais la surcharge de la procédure stockée en ajoutant un paramètre facultatif car @Dan Guzman a déclaré. De cette façon, d'autres utilisateurs n'affecteront pas de votre changement
Ajout d'une édition à ma question, qui efface mon raisonnement.
Si vous n'avez pas le droit de modifier ou de créer un nouveau SP, le seul moyen est d'appeler SP N Times je pense
Cela pourrait être le cas ... au mauvais si c'est vraiment.
ci-dessous est un exemple en utilisant un paramètre valorisé de la table.
Je vois de votre commentaire sur la réponse à la scène de string que vous ne souhaitez pas modifier l'interface de procédure stockée existante. Envisagez de créer une nouvelle procédure stockée pour l'interface de liste ou surcharger l'interface existante avec le paramètre de liste facultatif pour éviter un changement de rupture. p>
Ajout d'une modification à ma question, qui efface mes besoins.
@ruohola, il n'y a pas de solution T-SQL si vous ne pouvez pas modifier le processus ou en créer un nouveau.
Vous devez utiliser des types de table
Dans votre procédure stockée, utilisez un type de table défini par l'utilisateur en tant que type de votre valeur.
Il pourrait s'agir d'une chose comme ceci: listOfid est un type de table défini par l'utilisateur, comme vous pouvez le voir ci-dessous: p> à utiliser Votre procédure stockée Foottortored Vous devez d'abord déclarer une table TEMP et insérer vos données dans cette table TEMP et transmettez-la à votre procédure stockée.
Cela pourrait être une chose comme ceci: p>
Merci, mais j'ai édité ma question à affirmer que je préférerais ne pas modifier la procédure existante.
Donc, la seule façon de le faire est d'exécuter votre procédure stockée autant de fois que la longueur de votre liste
Oui, cela semble être le cas, ma réponse soumise reflète également cela.
Comme @ikram et @Danguzman a dit, le seul moyen de le faire, sans modifier la procédure existante ni en faire une nouvelle, consiste à simplement exécuter N fois stocké. La requête peut être construite assez vite avec par exemple Vim.
à partir du fichier (beaucoup plus de numéros en réalité): p> et exécuté les commandes: p> résultat: p>
A Valeur de la table Le paramètre serait mieux. Une autre option transmet la liste délimitée sous forme de chaîne unique, puis diviser les valeurs.
@Danguzman, je ne connais pas de ces techniques. Souhaitez-vous élargir votre commentaire dans une réponse?
Quelle est votre version SQL?
Si vous ne voulez pas modifier la procédure existante, la meilleure option serait de copier la procédure stockée actuelle et de modifier la copie à utiliser avec un paramètre de valorisation de la table. Je sais que cela enfreint un peu sec mais c'est généralement moins important dans SQL alors dans la programmation.
@Zhorov SQL Server 2016
@Zoharpeled a ajouté une édition à ma question, qui efface mon raisonnement.
@ruohola Vous devriez être prêt à accepter la responsabilité des temps de requête à faible performance possibles, si vous choisissez d'accéder à cet itinéraire où le seul moyen de résoudre votre problème consiste à appeler la procédure stockée avec chaque paramètre. Si la performance est inacceptable, la seule solution serait d'aller la façon dont Dangzman suggéra, où finalement vous devrez trouver une personne capable de changer la procédure.
@Radugheorghiu Ouais, la mauvaise performance momentanée ne sera pas un problème.
@ruohola, il n'est généralement jamais maintenant i>, mais ce type de problème échoue généralement rapidement au point où vous devez aborder le code de procédure stocké. Bonne chance!
@RADUGHEORGHIU C'est heureusement une chose unique (au moins j'espère: D)