Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

@Parametro en el IN de una consulta SQL

Estas en el tema de @Parametro en el IN de una consulta SQL en el foro de SQL Server en Foros del Web. Buenas a todos, Estaba realizando un procedimiento almancenado donde se para por parametro una serie de "abonados" que despues son usados en el Where dentro ...
  #1 (permalink)  
Antiguo 22/07/2010, 04:24
 
Fecha de Ingreso: julio-2010
Mensajes: 3
Antigüedad: 14 años, 3 meses
Puntos: 0
Pregunta @Parametro en el IN de una consulta SQL

Buenas a todos,

Estaba realizando un procedimiento almancenado donde se para por parametro una serie de "abonados" que despues son usados en el Where dentro de un IN.

os pongo la sentencia completa, es sobre SQL 2000

Código:
CREATE PROCEDURE prc_00_pruebaIN
	-- Add the parameters for the stored procedure here
	@abonados nvarchar(1000) 
	AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here

	SELECT * FROM dbo.[system] WHERE cs_no IN (@abonados)

	DECLARE @sql AS VARCHAR(1000)
	SET @sql = 'SELECT * FROM dbo.[system] WHERE cs_no IN (' + @abonados	+ ')'
	PRINT @sql
END
GO
bien, a la hora de ejecutar el procedimiento

si pongo esto, no muestra datos
Código:
prc_00_pruebaIN '''BB0048'',''BB9682'''

Pero si pongo esto, si muestra datos
Código:
prc_00_pruebaIN 'BB0048'
Como vereis hago un print para ver como construye la consulta, pero luego no me muestra nada cuando le paso por parametro mas de un "abonado"

Que es lo que estoy haciendo mal? o es que lo que estoy intentando hacer no se puede hacer.

Podria ejecutar un EXEC sp_execute @sql PERO la consulta real sobre la que he de aplicar esto, ocupa mas de los caracteres permitidos por un tipo Nvarchar por lo que no puedo construir la SQL dinamicamente...

Alguna idea/sugerencia/solucion???

muchas muchas gracias!!!
  #2 (permalink)  
Antiguo 22/07/2010, 09:26
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 3 meses
Puntos: 39
Respuesta: @Parametro en el IN de una consulta SQL

Si usas nvarchar tienes hasta 4000 caracteres.
La solucion es sql dinamico.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 22/07/2010, 09:35
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: @Parametro en el IN de una consulta SQL

Y es mucho mejor utilizar EXISTS y NOT EXISTS, que utilizar el IN
  #4 (permalink)  
Antiguo 23/07/2010, 03:17
 
Fecha de Ingreso: julio-2010
Mensajes: 3
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: @Parametro en el IN de una consulta SQL

Cita:
Iniciado por flaviovich Ver Mensaje
Si usas nvarchar tienes hasta 4000 caracteres.
La solucion es sql dinamico.
no puedo usar sql dinamico porque la consulta SQL ocupa mas de 4000 caracteres

Cita:
Iniciado por iislas Ver Mensaje
Y es mucho mejor utilizar EXISTS y NOT EXISTS, que utilizar el IN
como meto una variable como las que he puesto arriba en un EXISTS??

si @abonados son 'BB0048','BB9682'

como lo meto por variable en un EXISTS ??? no creo que sea compatible... exists seria para un solo abonado, pero no para varios


seria lo mismo

Where cs_no EXISTS (select * from system where cs_no.... ???
que mas??

a ver si alguien puede ponerme una sentencia que creais que pueda funcionar

Gracias a todos!!

Última edición por jaimecb; 23/07/2010 a las 03:33
  #5 (permalink)  
Antiguo 23/07/2010, 09:16
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 3 meses
Puntos: 39
Respuesta: @Parametro en el IN de una consulta SQL

Esto debe funcionar:
Código SQL:
Ver original
  1. DECLARE @abonados1 nvarchar(4000)
  2. DECLARE @abonados2 nvarchar(4000)
  3. DECLARE @tabla TABLE(abonado nvarchar(50))
  4.  
  5. SET @abonados1 = 'BB0048,BB9682,BB1597'
  6. SET @abonados2 = 'BB0123,BB0071'
  7.  
  8. DECLARE @ini SMALLINT
  9. DECLARE @fin SMALLINT
  10.  
  11. SELECT @ini = 0, @fin = charindex(',', @abonados1, @ini + 1)
  12.  
  13. while @fin <> 0
  14. BEGIN
  15.     INSERT INTO @tabla SELECT SUBSTRING(@abonados1, @ini+1, @fin - @ini - 1)
  16.     SET @ini = charindex(',', @abonados1, @ini + 1)
  17.     SET @fin = charindex(',', @abonados1, @ini + 1)
  18. END
  19. INSERT INTO @tabla SELECT SUBSTRING(@abonados1, @ini+1, len(@abonados1))
  20.  
  21. SELECT * FROM dbo.[system] WHERE EXISTS(SELECT 1 FROM @tabla WHERE cs_no = abonado)
Si son mas de 4000 caracteres usa un parametro mas: @abonados2.
Solo quedaria agregar los abonados del segundo parametro.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 23/07/2010, 12:42
Avatar de otreblanc  
Fecha de Ingreso: mayo-2005
Ubicación: Chiapas, la última frontera...
Mensajes: 73
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: @Parametro en el IN de una consulta SQL

Perfecta solución flaviovich

El ultimo select
SELECT * FROM dbo.[system] WHERE EXISTS(SELECT 1 FROM @tabla WHERE cs_no = abonado)


se pondría asi:
SELECT <campos> FROM dbo.[system] WHERE cs_no in (SELECT abonado FROM @tabla)

Segun entiendo es lo que necesita jaimecb
  #7 (permalink)  
Antiguo 23/07/2010, 13:31
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 3 meses
Puntos: 39
Respuesta: @Parametro en el IN de una consulta SQL

Hola otreblanc!
Ambos hacen lo mismo, pero mas optimo es usar EXISTS.
Esperemos a ver que dice jaimecb.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #8 (permalink)  
Antiguo 26/07/2010, 00:36
 
Fecha de Ingreso: julio-2010
Mensajes: 3
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: @Parametro en el IN de una consulta SQL

Buenas a todos y gracias por las respuestas,

otra idea que se me ha ocurrido a mi, es dentro del procedimiento, llamar a una funcion SPLIT que divida la cadena y la devuelva como si fuera una tabla y despues hacer un inner join

Código:
inner join  SplitParameterValues (@abonados , ',') on....
ahora voy a probar la solucion de arriba y os comento ;)
Gracias!!


----
Editado:

acabo de ver que la solucion de @flaviovich incorpora eso mismo justo antes de la consulta ;) jejeje
voy a probarlo todo y a ver como queda todo

Última edición por jaimecb; 26/07/2010 a las 00:45

Etiquetas: parametros, select, parámetros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:53.