Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Clause SQL IN dans une procédure stockée

Il existe plusieurs façons d'y parvenir :

  1. SQL dynamique, comme indiqué dans cet article :http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Spécifiez chaque élément dans des variables (cela peut devenir assez moche si vous en avez beaucoup) :

    @var1 varchar(20),@var2 varchar(20),@var3 varchar(20)

  3. Écrivez une fonction de fractionnement pour transformer la chaîne en une variable de table, il y en a beaucoup. Celui-ci est mon préféré :http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Utiliser un paramètre de valeur de table (2008) :http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Voici une petite astuce utilisant CHARINDEX (notez que cette approche est Non-Sargable) :

Votre chaîne ressemble à ceci :'abc,def'

Utilisation de CHARINDEX , vous remplissez à la fois la chaîne de recherche et la valeur que vous souhaitez trouver dans la chaîne de recherche avec votre délimiteur. Donc, en utilisant mon petit exemple, la chaîne deviendrait ', abc, def,' Notez les virgules supplémentaires au début et à la fin. Faites ensuite la même chose pour les données du champ. Si vous avez des virgules dans vos données, vous devrez remplacer le délimiteur par autre chose, comme char(2), ou des points-virgules, ou autre.

Ensuite pour effectuer la recherche :

WHERE CHARINDEX ( ',' + expressionToFind + ',' , ',' + expressionToSearch ',') > 0

Le remplissage délimiteur empêche la recherche de trouver "abcabc" mais trouvera "abc", la correspondance exacte.

Si vous utilisez 2005, je prendrais une fonction de fractionnement très rapide afin que vous puissiez éviter d'utiliser du SQL dynamique.