2011-08-04 17 views
5

Estoy trabajando en una página de consulta donde un usuario selecciona un valor que representa diferentes tipos, cada uno identificado por una ID. El problema es seleccionar estos ID de la base de datos utilizando el método WHERE IN.Pase cadena a SQL DONDE EN

Esta es mi declaración SQL

SELECT M.REG_NO, T.TYPE_ID 
    FROM MAIN AS M 
     INNER JOIN CLASSIFICATION AS C 
      ON M.REG_NO = C.REG_NO 
     INNER JOIN TYPE AS T 
      ON T.TYPE_ID = C.TYPE_ID 
    WHERE T.TYPE_ID IN (@Types) 

va a trabajar para un solo valor, por ejemplo. 46, pero NO si el valor está entre paréntesis, ej. (46) o ('46'), como debería ser para IN.

Estoy usando visual studio que genera automáticamente el método para acceder al adaptador de tabla para obtener los valores, así que creo que TENGO que hacer esto a través de SQL.

Estoy pasando una cadena, por ej. Types = "46,267,2010", en el método del adaptador que pasa la cadena a los @Types en la instrucción SQL.

Cualquier ayuda sería genial. ¡Gracias!

+0

No sabe SQL Server, pero en Oracle, no puede pasar una variable enlazada como sus @Types; debe pasar una var o constan separada t para cada valor IN. –

Respuesta

10

Este es un problema bastante común: no estoy seguro de por qué TSQL aún no lo ha solucionado. De todos modos, la solución que he encontrado funciona mejor para mí es convertir la variable en una tabla, y luego puedes usar IN() en ella muy bien.

A partir de la función:

CREATE Function [dbo].[ParseStringList] (@StringArray nvarchar(max)) 
Returns @tbl_string Table (ParsedString nvarchar(max)) As 

BEGIN 

DECLARE @end Int, 
     @start Int 

SET @stringArray = @StringArray + ',' 
SET @start=1 
SET @end=1 

WHILE @end<Len(@StringArray) 
    BEGIN 
     SET @end = CharIndex(',', @StringArray, @end) 
     INSERT INTO @tbl_string 
      SELECT 
       Substring(@StringArray, @start, @[email protected]) 

     SET @[email protected]+1 
     SET @end = @end+1 
    END 

RETURN 
END 

Y a continuación, utilizar la función ...

SELECT * 
FROM table 
WHERE SomeFieldValue In (Select ParsedString From dbo.ParseStringList(@Types)) 
+0

Gracias voy a dar esto hace. – Anto

5

Es porque necesita tener un conjunto de valores separados por comas. Como

WHERE 
T.TYPE_ID IN ('46', '45', '44'); 

¿Está utilizando SQL Server u Oracle, MySQL?

Si usted tiene una cadena compuesta por sus múltiples valores como

T.TYPE_ID IN ('46,45,44'); 

Es posible que tenga una función que va a explotar la cadena de usign un delimitador (split o lo que se llama en función de que DBMS)

+0

Su servidor SQL. Intenté ingresar los valores como ('46', '45', '44') y no funcionó. – Anto

+0

¿Cuál es su tipo de datos? '45' supone que Type_ID es datos char/varchar/nvarchar. Si Type_ID es entero, usaría (46,45,44) en su lugar. – VoteCoffee

1

La siguiente Select trabajando bien para mí:

SELECT M.REG_NO, T.TYPE_ID 
     FROM MAIN AS M 
      INNER JOIN CLASSIFICATION AS C 
       ON M.REG_NO = C.REG_NO 
      INNER JOIN TYPE AS T 
       ON T.TYPE_ID = C.TYPE_ID 
     WHERE (','[email protected]+',') LIKE '%,' +T.TYPE_ID+ ',%'