2012-08-08 17 views
7

Duplicar posible:
Need help in dynamic query with IN Clausela creación dinámica de la cláusula IN en un procedimiento almacenado

estoy usando SQL Server 2008 y este es el problema que estoy enfrentando. Tengo una tabla llamada Cars with a column Company. Ahora tengo un procedimiento almacenado que se ve algo como esto

 
CREATE PROCEDURE FindCars (@CompanyNames varchar(500)) 
AS 
SELECT * FROM Cars WHERE Company IN (@CompanyNames) 

Probé algo como esto y fallé

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

exec FindCars @CompanyNames 

que no consigue cualesquiera filas devueltas. Cuando hago lo siguiente

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

Select @CompanyNames 

me sale el siguiente resultado

 
'Ford','BMW' 

y si puedo reemplazar este valor en la instrucción de selección dentro del procedimiento almacenado, funciona

 
SELECT * FROM Cars where Company in ('Ford','BMW') 

Así me piense que el procedimiento almacenado parece tratar 'Ford','BMW' como una cadena en lugar de una matriz. Podría alguien ayudarme con esto, por favor. ¿Cómo construyo dinámicamente la cadena/matriz requerida en la cláusula IN de la instrucción select dentro del procedimiento almacenado?

Respuesta

7

Tiene razón, creó una cadena y está siendo procesada como una lista de cadenas que contiene una cadena. Las comas son solo caracteres en esa cadena. El único equivalente a una matriz en SQL Server es una tabla.

Por ejemplo; WHERE x IN (SELECT y FROM z).

Por esta razón muchas personas crean una función SPLIT_STRING() que devuelve una tabla de elementos de una cadena separada delimitted dado ...

WHERE x IN (SELECT item FROM dbo.split_string(@input_string)) 

Hay muchas maneras de implementar esa cadena dividida. Algunas cadenas de retorno, algunas emitidas a enteros, otras aceptan un segundo parámetro de "delimitador", etc., etc. Puede buscar en Internet SQL SERVER SPLIT STRING y obtener muchos resultados, incluido aquí en StackOverflow.


Una alternativa es utilizar SQL dinámico; SQL que escribe SQL.

SET @sql = 'SELECT * FROM x WHERE y IN (' + @input_string_list + ')' 

SP_EXECEUTESQL @sql 

(recomiendo SP_EXECUTESQL más justo EXEC porque el primero le permite utilizar consultas parametrizadas, pero el segundo no.)

+1

sólo para añadir un punto, creo que esto es mejor SELECT * de automóviles Unión interior ( \t SELECCIONE elemento FROM dbo.split_string (@input_string) ) k en K.Item = Company' porque estás haciendo una iteración usando 'IN' Predicate –

+0

El primer método es el que yo recomiendo, aquí puedes encontrar una buena función de división: [http://www.sqlservercentral.com/articles/Tally+Table /72993/](http://www.sqlservercentral.com/articles/Tally+Table/72993/) – lennin92

Cuestiones relacionadas