Estoy tratando de depurar los informes SQL de otra persona y he colocado la consulta de informes subyacente en una ventana de consulta de SQL 2012.
Uno de los parámetros que solicita el informe es una lista de enteros. Esto se logra en el informe a través de un cuadro desplegable de selección múltiple. La consulta subyacente del informe utiliza esta lista entera en la where
cláusula, por ejemplo
select *
from TabA
where TabA.ID in (@listOfIDs)
No quiero modificar la consulta que estoy depurando, pero no puedo entender cómo crear una variable en el servidor SQL que pueda contener este tipo de datos para probarla.
p.ej
declare @listOfIDs int
set listOfIDs = 1,2,3,4
No hay ningún tipo de datos que pueda contener una lista de enteros, entonces, ¿cómo puedo ejecutar la consulta de informe en mi SQL Server con los mismos valores que el informe?
fuente
Respuestas:
Tabla variable
o
fuente
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
esta consulta devolverá varias ID y recibo un error que dice que la subconsulta devolvió más de un resultado y que no está permitido. ¿Hay alguna forma de crear una variable que almacene una matriz si los ID de una subconsulta?Suponiendo que la variable es algo similar a:
Y el Procedimiento almacenado lo está utilizando de esta forma:
Puede crear la IntList y llamar al procedimiento así:
O si proporciona la IntList usted mismo
fuente
Tiene razón, no hay ningún tipo de datos en SQL-Server que pueda contener una lista de enteros. Pero lo que puede hacer es almacenar una lista de enteros como una cadena.
Luego puede dividir la cadena en valores enteros separados y ponerlos en una tabla. Su procedimiento ya podría hacer esto.
También puede usar una consulta dinámica para lograr el mismo resultado:
fuente
Para SQL Server 2016+ y Azure SQL Database, se agregó la función STRING_SPLIT que sería una solución perfecta para este problema. Aquí está la documentación: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Aquí hay un ejemplo:
El resultado de la consulta es 1,3
~ Saludos
fuente
Al final llegué a la conclusión de que sin modificar cómo funciona la consulta no podría almacenar los valores en variables. Utilicé el generador de perfiles SQL para capturar los valores y luego los codifiqué en la consulta para ver cómo funcionaba. Había 18 de estos arreglos enteros y algunos tenían más de 30 elementos en ellos.
Creo que MS / SQL necesita introducir algunos tipos de datos adicionales en el lenguaje. Las matrices son bastante comunes y no veo por qué no podría usarlas en un proceso almacenado.
fuente
No puede hacerlo así, pero puede ejecutar toda la consulta almacenándola en una variable.
Por ejemplo:
fuente
Hay una nueva función en SQL llamada
string_split
si está utilizando la lista de cadenas. Enlace de referencia STRING_SPLIT (Transact-SQL)puede pasar esta consulta de la
in
siguiente manera:fuente
Yo uso esto :
1-Declare una variable de tabla temporal en el script de su edificio:
2-Asignar a la tabla temporal:
3-Consulte la tabla cuando la necesite en una declaración WHERE:
fuente