Existe-t-il un moyen élégant de gérer le passage d'une liste d'ID en tant que paramètre à une procédure stockée?
Par exemple, je veux que les départements 1, 2, 5, 7, 20 soient renvoyés par ma procédure stockée. Dans le passé, j'ai passé une liste d'ID délimités par des virgules, comme le code ci-dessous, mais je me sens vraiment sale de le faire.
Je pense que SQL Server 2005 est ma seule limitation applicable.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
la source
la source
Réponses:
Erland Sommarskog a maintenu la réponse faisant autorité à cette question pendant les 16 dernières années: tableaux et listes dans SQL Server .
Il existe au moins une douzaine de façons de transmettre un tableau ou une liste à une requête; chacun a ses propres avantages et inconvénients.
Je ne saurais vraiment recommander assez de lire l'article pour en savoir plus sur les compromis entre toutes ces options.
la source
Oui, votre solution actuelle est sujette aux attaques par injection SQL.
La meilleure solution que j'ai trouvée est d'utiliser une fonction qui divise le texte en mots (il y en a quelques-uns postés ici, ou vous pouvez utiliser celle-ci de mon blog ), puis de la joindre à votre table. Quelque chose comme:
la source
Une méthode que vous voudrez peut-être envisager si vous allez beaucoup travailler avec les valeurs consiste à les écrire d'abord dans une table temporaire. Ensuite, vous rejoignez simplement comme d'habitude.
De cette façon, vous ne analysez qu'une seule fois.
Il est plus facile d'utiliser l'un des UDF `` fractionnés '', mais tellement de gens en ont publié des exemples, j'ai pensé que je choisirais une voie différente;)
Cet exemple créera une table temporaire que vous pourrez rejoindre (#tmpDept) et la remplira avec les identifiants de service que vous avez transmis. Je suppose que vous les séparez par des virgules, mais vous pouvez - bien sûr - changer à ce que vous voulez.
Cela vous permettra de passer un identifiant de service, plusieurs identifiants avec des virgules entre eux, ou même plusieurs identifiants avec des virgules et des espaces entre eux.
Donc, si vous avez fait quelque chose comme:
Vous verriez les noms de tous les ID de service que vous avez transmis ...
Encore une fois, cela peut être simplifié en utilisant une fonction pour peupler la table temporaire ... Je l'ai principalement fait sans une juste pour tuer l'ennui :-P
- Kevin Fairchild
la source
Vous pouvez utiliser XML.
Par exemple
La commande sp_xml_preparedocument est intégrée.
Cela produirait la sortie:
qui a tout (plus?) de ce dont vous avez besoin.
la source
Une méthode XML ultra-rapide, si vous souhaitez utiliser une procédure stockée et transmettre la liste des ID de service séparés par des virgules:
Tout le mérite revient au blog de Guru Brad Schulz
la source
Essaye celui-là:
très simple.
la source