sql >> Base de Datos >  >> RDS >> Sqlserver

Cláusula SQL IN en procedimiento almacenado

Hay varias formas de lograr esto:

  1. SQL dinámico, como se indica en este artículo:http://asheej.blogspot.com/2012/04/how-to-use-ms-sql-in-clause-with.html

  2. Especifique cada elemento en variables (esto puede ponerse bastante feo si tiene muchos):

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

  3. Escriba una función de división para convertir la cadena en una variable de tabla, hay muchas de ellas por ahí. Este es mi favorito personal:http://dataeducation.com/faster -más-escalable-sqlclr-string-splitting/

  4. Use un parámetro de valor de tabla (2008):http://www.techrepublic.com/blog/datacenter/passing-table-valued-parameters-in-sql-server-2008/168

  5. Aquí hay un pequeño truco usando CHARINDEX (tenga en cuenta que este enfoque no es Sargable):

Su cadena es así:'abc,def'

Usando CHARINDEX , rellena tanto la cadena de búsqueda como el valor que desea encontrar dentro de la cadena de búsqueda con su delimitador. Entonces, usando mi pequeño ejemplo, la cadena se convertiría en ',abc,def'. Observe las comas adicionales al principio y al final. Luego haga lo mismo con los datos del campo. Si tiene comas en sus datos, tendrá que cambiar el delimitador por otro, como char(2), punto y coma, o lo que sea.

Luego para realizar la búsqueda:

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

El relleno delimitador evita que la búsqueda encuentre "abcabc", pero encontrará "abc", coincidencia exacta.

Si está utilizando 2005, tomaría una función de división realmente rápida para que pueda evitar el uso de SQL dinámico.