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

sp_executesql con declaración 'IN'

La razón por la que no funciona es porque @P1 se trata como un valor único.

p.ej. cuando @Code es X101, B202, entonces la consulta se ejecuta como:SELECT * FROM Table WHERE RegionCode IN ('X101, B202') Entonces, está buscando un RegionCode con el valor contenido en @ P1. Incluso cuando incluye comillas simples, todo lo que significa es que se espera que el valor que busca en RegionCode contenga esas comillas simples.

En realidad, necesitaría concatenar la variable @Code en el texto del comando @Cmd sql para que funcione de la manera que está pensando:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Sin embargo, obviamente, esto solo lo abre a la inyección SQL, por lo que deberá tener mucho cuidado si adopta este enfoque para asegurarse de protegerse contra eso.

Existen formas alternativas de lidiar con esta situación en la que desea pasar una lista dinámica de valores para buscar.

Consulte los ejemplos en mi blog para 2 enfoques que podría usar con SQL Server 2005. Uno implica pasar una lista CSV en la forma "Valor1, Valor2, Valor3" que luego se divide en una variable TABLE usando una función definida por el usuario (hay muchas menciones de esto acércate si haces un google rápido o buscas de este sitio). Una vez que se divide, se une a esa variable TABLE en su consulta principal. El segundo enfoque consiste en pasar un blob XML que contiene los valores y usar la funcionalidad XML integrada de SQL Server. Ambos enfoques se demuestran con métricas de rendimiento en ese enlace y no requieren SQL dinámico.

Si estuviera utilizando SQL Server 2008, los parámetros de valor de tabla serían el camino a seguir:ese es el tercer enfoque que demuestro en ese enlace que resulta mejor.