Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Clausola SQL IN nella stored procedure

Ci sono diversi modi per farlo:

  1. SQL dinamico, come sottolineato in questo articolo:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Specifica ogni elemento nelle variabili (questo può diventare piuttosto brutto se ne hai molti):

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

  3. Scrivi una funzione di divisione per trasformare la stringa in una variabile di tabella, ce ne sono molte là fuori. Questo è il mio preferito:http://dataeducation.com/faster -more-scalable-sqlclr-string-splitting/

  4. Utilizzare un parametro valore tabella (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Ecco un piccolo trucco usando CHARINDEX (nota che questo approccio non è Sargable):

La tua stringa è così:'abc,def'

Usando CHARINDEX , riempi con il tuo delimitatore sia la stringa di ricerca che il valore che desideri trovare all'interno della stringa di ricerca. Quindi, usando il mio piccolo esempio, la stringa diventerebbe ',abc,def,' Notare le virgole extra all'inizio e alla fine. Quindi fai la stessa cosa con i dati del campo. Se hai virgole nei tuoi dati, dovrai sostituire il delimitatore con qualcos'altro, come char(2) o punto e virgola o altro.

Quindi per eseguire la ricerca:

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

Il riempimento del delimitatore impedisce alla ricerca di trovare "abcabc" ma troverà "abc", corrispondenza esatta.

Se stai usando 2005, prenderei una funzione di divisione molto veloce in modo da poter evitare l'uso di SQL dinamico.