Tengo una consulta Transact-SQL que usa el operador IN. Algo como esto:
select * from myTable where myColumn in (1,2,3,4)
¿Hay alguna manera de definir una variable para contener toda la lista "(1,2,3,4)"? ¿Cómo debo definirlo?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Respuestas:
fuente
fuente
[Err] 42000 - [SQL Server]Must declare the scalar variable "@mylist".
(VALUES (1),(2),(3),(4),(5))
directamente?Hay dos formas de abordar las listas de csv dinámicas para consultas TSQL:
1) Usando una selección interna
2) Uso de TSQL concatenado dinámicamente
3) Una posible tercera opción son las variables de tabla. Si tiene SQl Server 2005, puede usar una variable de tabla. Si está en Sql Server 2008, incluso puede pasar variables de tabla completas como un parámetro a los procedimientos almacenados y usarlo en una combinación o como una subselección en la cláusula IN.
fuente
Use una función como esta:
En lugar de usar like, realiza una unión interna con la tabla devuelta por la función:
se convierte
En una tabla de registro 1M no indexada, la segunda versión tardó aproximadamente la mitad del tiempo ...
salud
fuente
Tenga en cuenta que para una lista larga o sistemas de producción no se recomienda usar de esta manera, ya que puede ser mucho más lento que el simple
IN
operadorsomeColumnName in (1,2,3,4)
(probado con una lista de más de 8000 artículos)fuente
No, no existe tal tipo. Pero hay algunas opciones:
Ninguno de estos es realmente elegante, pero eso es lo mejor que hay.
fuente
ligera mejora en @LukeH, no hay necesidad de repetir "INSERT INTO": y la respuesta de @ realPT - no es necesario tener SELECT:
fuente
Sé que esto es antiguo ahora, pero TSQL => 2016, puede usar STRING_SPLIT:
fuente
A partir de SQL2017, puede usar STRING_SPLIT y hacer esto:
fuente
Si desea hacer esto sin usar una segunda tabla, puede hacer una comparación LIKE con un CAST:
Si el campo que está comparando ya es una cadena, no necesitará CAST.
Rodeando tanto la coincidencia de columna como cada valor único en comas asegurará una coincidencia exacta. De lo contrario, un valor de 1 se encontraría en una lista que contiene ', 4,2,15,'
fuente
Como nadie lo mencionó antes, a partir de Sql Server 2016 también puede usar matrices json y
OPENJSON (Transact-SQL)
:Puedes probarlo en sql fiddle demo
También puede cubrir casos más complicados con json más fácilmente: consulte Buscar lista de valores y rango en SQL utilizando la cláusula WHERE IN con la variable SQL.
fuente
Éste usa PATINDEX para hacer coincidir los identificadores de una tabla con una lista de enteros delimitados sin dígitos.
Notas:
fuente
fuente
Creo que tendrá que declarar una cadena y luego ejecutar esa cadena SQL.
Echa un vistazo a sp_executeSQL
fuente