¿Hay alguna manera elegante de manejar pasar una lista de identificadores como parámetro a un procedimiento almacenado?
Por ejemplo, quiero que los departamentos 1, 2, 5, 7, 20 sean devueltos por mi procedimiento almacenado. En el pasado, pasé una lista de identificadores delimitados por comas, como el código a continuación, pero me siento muy sucio haciéndolo.
SQL Server 2005 es mi única limitación aplicable, creo.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
fuente
fuente
Respuestas:
Erland Sommarskog ha mantenido la respuesta autorizada a esta pregunta durante los últimos 16 años: matrices y listas en SQL Server .
Hay al menos una docena de formas de pasar una matriz o lista a una consulta; cada uno tiene sus propios pros y contras únicos.
Realmente no puedo recomendar lo suficiente para leer el artículo para conocer las compensaciones entre todas estas opciones.
fuente
Sí, su solución actual es propensa a los ataques de inyección SQL.
La mejor solución que he encontrado es usar una función que divide el texto en palabras (hay algunas publicadas aquí, o puedes usar esta de mi blog ) y luego unirlas a tu tabla. Algo como:
fuente
Un método que quizás desee considerar si va a trabajar mucho con los valores es escribirlos primero en una tabla temporal. Entonces solo te unes a él como de costumbre.
De esta manera, solo estás analizando una vez.
Es más fácil usar uno de los UDF 'Split', pero tanta gente ha publicado ejemplos de eso, pensé que iría por una ruta diferente;)
Este ejemplo creará una tabla temporal para que se una (#tmpDept) y la complete con los ID del departamento que ingresó. Supongo que los está separando con comas, pero puede, por supuesto, cambiar a lo que quieras.
Esto le permitirá pasar una identificación de departamento, múltiples identificaciones con comas entre ellas, o incluso múltiples identificaciones con comas y espacios entre ellas.
Entonces, si hiciste algo como:
Vería los nombres de todas las ID de departamento que pasó ...
Nuevamente, esto se puede simplificar usando una función para llenar la tabla temporal ... Principalmente lo hice sin una solo para matar el aburrimiento :-P
- Kevin Fairchild
fuente
Podrías usar XML.
P.ej
El comando sp_xml_preparedocument está integrado.
Esto produciría la salida:
que tiene todo (¿más?) de lo que necesitas.
fuente
Un método XML superrápido, si desea utilizar un procedimiento almacenado y pasar la lista separada por comas de ID de departamento:
Todo el crédito va al blog de Guru Brad Schulz
fuente
Prueba este:
muy simple.
fuente