SQL en consulta (@Variable)

Tengo el siguiente código, el problema es que mi list de variables @LocationList es esencialmente una cadena csv. Cuando uso esto como parte de where ID de location en (@LocationList) dice que no es un int (LocationID es un int). ¿Cómo puedo get esta cadena csv para ser aceptada por la cláusula teh in?

Declare @LocationList varchar(1000) Set @LocationList = '1,32' select Locations from table where Where LocationID in (@LocationList) 

La forma más eficiente de hacer esto es con Dynamic SQL como rt2800 mentions (con advertencias de inyección de Michael Allen)

Sin embargo, puedes hacer una function:

 ALTER FUNCTION [dbo].[CSVStringsToTable_fn] ( @array VARCHAR(8000) ) RETURNS @Table TABLE ( value VARCHAR(100) ) AS BEGIN DECLARE @separator_position INTEGER, @array_value VARCHAR(8000) SET @array = @array + ',' WHILE PATINDEX('%,%', @array) <> 0 BEGIN SELECT @separator_position = PATINDEX('%,%', @array) SELECT @array_value = LEFT(@array, @separator_position - 1) INSERT @Table VALUES ( @array_value ) SELECT @array = STUFF(@array, 1, @separator_position, '') END RETURN END 

y select de ella:

 DECLARE @LocationList VARCHAR(1000) SET @LocationList = '1,32' SELECT Locations FROM table WHERE LocationID IN ( SELECT * FROM dbo.CSVStringsToTable_fn(@LocationList) ) 

O

 SELECT Locations FROM table loc INNER JOIN dbo.CSVStringsToTable_fn(@LocationList) list ON list.value = loc.LocationID 

Lo cual es extremadamente útil cuando intenta enviar una list de valores múltiples de SSRS a un PROC.

A menudo tengo este requisito, y ALGUNAS VECES , si conoce muy bien la columna que está buscando en [el tamaño / formatting / longitud], puede hacer una especie de REGEX.

Algo como esto :

  DECLARE @MyListOfLocation varchar(255) set @MyListOfLocation = '|1|32|36|24|3|' Select LocationID from Table where @MyListOfLocation like '%|' + LocationID + '|%' 

NOTA : el carácter PIPE se usa para proteger la consulta de devolver cualquier LocationID que contenga un solo carácter (el '1', por ejemplo).

Aquí hay un ejemplo completo de trabajo:

 DECLARE @MyListOfLocation varchar(255) set @MyListOfLocation = '|1|11|21|' SELECT LocationName FROM ( select '1' as LocationID, 'My Location 1' as LocationName union all select '11' as LocationID, 'My Location 11' as LocationName union all select '12' as LocationID, 'My Location 12' as LocationName union all select '13' as LocationID, 'My Location 13' as LocationName union all select '21' as LocationID, 'My Location 21' as LocationName ) as MySub where @MyListOfLocation like '%|' + LocationID + '|%' 

¡ADVERTENCIA! ¡Este método no es amigable con el índice!

Si desea agregar IN (@MyListOfLocation) en todo eso, para aprovechar el uso de INDEXES, puede modificar su secuencia de commands a:

 SELECT MyDATA.* FROM HugeTableWithAnIndexOnLocationID as MyDATA WHERE LocationID in ( Select LocationID from Table where @MyListOfLocation like '%|' + LocationID + '|%') 
 declare @querytext Nvarchar(MAX) set @querytext = 'select Locations from table where Where LocationID in (' + @LocationList + ');'; exec sp_executesql @querytext;