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

Consulta con variable dentro del IN

Estas en el tema de Consulta con variable dentro del IN en el foro de SQL Server en Foros del Web. Buen día amigos, gracias de antemano por su respuesta; estoy realizando un sp en la cual necesito que ingrese una variable que contenga números separados ...
  #1 (permalink)  
Antiguo 29/08/2012, 09:26
 
Fecha de Ingreso: octubre-2003
Ubicación: Perú
Mensajes: 39
Antigüedad: 20 años, 6 meses
Puntos: 0
Pregunta Consulta con variable dentro del IN

Buen día amigos, gracias de antemano por su respuesta; estoy realizando un sp en la cual necesito que ingrese una variable que contenga números separados por comas: @valores = 100, 200, 300, 400, .... , 4500 y estas deben ir dentro de una consulta en la sección: WHERE numConcepto IN (@valores), el detalle es que no logro reconocerlo porque el tipo de dato de numConcepto es integer y los @valores están ingresando al sp como string.
-- Detalle
ALTER PROCEDURE [dbo].[sp_Programa]
@obligaciones String(1000)
AS
BEGIN
-- ........
-- select .....
WHERE numConcepto IN (@valores)
-- WHERE numConcepto IN (100, 200, 300, 400) Funciona perfecto pero es
-- demasiado largo y quiero personalizable desde formulario
Alguna salida amigos, gracias nuevamente.
__________________
un conocimiento compartido es un conocimiento que evoluciona.
  #2 (permalink)  
Antiguo 29/08/2012, 09:49
 
Fecha de Ingreso: febrero-2012
Ubicación: San juan de luriguashington
Mensajes: 39
Antigüedad: 12 años, 2 meses
Puntos: 2
Respuesta: Consulta con variable dentro del IN

puedes usar el exec te paso un ejemplo

vb net

dim Codigos as string
Codigos = ""
For Each row1 As DataGridViewRow In MIDATAGRID.Rows
If row1.Cells("MICHEKBOX").Value = True Then
'RECUPERO EL VALOR Y AUMENTOUNA COMA
Codigos = Codigos + RECUPEROELVALOR + ","
End If
Next
'TODA LA CADENA Y QUITO LA ULTIMA COMA
Codigos = Mid(Codigos, 1, Codigos.Length - 1)

PROCEDIMIENTO ALMACENADO

ALTER PROCEDURE [dbo].[sp_Programa]
@orden varchar(10)
AS
BEGIN
exec('select * from Orders
WHERE orderid IN ('+@orden+')')
end
go

  #3 (permalink)  
Antiguo 29/08/2012, 09:52
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

si no quieres usar querys dinamicos puedes hacer una funcion como la siguiente:


Código SQL:
Ver original
  1. /****** Object:  UserDefinedFunction [dbo].[SplitApplication]    Script Date: 10/19/2010 15:12:35 ******/
  2. SET ANSI_NULLS ON
  3. GO
  4.  
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7.  
  8. CREATE FUNCTION [dbo].[SplitApplication](@applicationid VARCHAR(2000))
  9.  
  10. RETURNS @RtnValue TABLE
  11. (
  12. Id INT IDENTITY(1,1),
  13. DATA nvarchar(100)
  14. )
  15. AS
  16. BEGIN
  17. DECLARE @Cnt INT, @SplitOn nvarchar(5)
  18. SET @SplitOn = ','
  19. SET @Cnt = 1
  20.  
  21. While (Charindex(@SplitOn,@applicationid)>0)
  22. BEGIN
  23. INSERT INTO @RtnValue (DATA)
  24. SELECT
  25. DATA = ltrim(rtrim(SUBSTRING(@applicationid,1,Charindex(@SplitOn,@applicationid)-1)))
  26.  
  27. SET @applicationid = SUBSTRING(@applicationid,Charindex(@SplitOn,@applicationid)+1,len(@applicationid))
  28. SET @Cnt = @Cnt + 1
  29. END
  30.  
  31. INSERT INTO @RtnValue (DATA)
  32. SELECT DATA = ltrim(rtrim(@applicationid))
  33.  
  34. RETURN
  35. END
  36.  
  37. GO
  38.  
  39.  
  40. how TO USE :
  41.  
  42. SELECT * FROM TABLE WHERE DATA IN (
  43.  
  44. SELECT * FROM SplitApplication('1,1,1,1')
  45. )

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 29/08/2012, 10:09
 
Fecha de Ingreso: febrero-2012
Ubicación: San juan de luriguashington
Mensajes: 39
Antigüedad: 12 años, 2 meses
Puntos: 2
Respuesta: Consulta con variable dentro del IN

TRATO DE USAR TUFUNCION Y ME SALE ERROR

SELECT * FROM ORDERS WHERE OrderID IN (
SELECT * FROM SplitApplication('10248,10249')
)
  #5 (permalink)  
Antiguo 29/08/2012, 10:17
 
Fecha de Ingreso: octubre-2003
Ubicación: Perú
Mensajes: 39
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: Consulta con variable dentro del IN

MI sp funciona bien, el detalle es que estoy implementadolo para que dentro del IN ingrese una variable desde un formulario y no cambiarlo desde el sp directamente porque son miles de datos que tendría que escribir en el IN. Gracias por el aporte lo probare Libras haber como anda.
__________________
un conocimiento compartido es un conocimiento que evoluciona.
  #6 (permalink)  
Antiguo 29/08/2012, 10:19
 
Fecha de Ingreso: febrero-2012
Ubicación: San juan de luriguashington
Mensajes: 39
Antigüedad: 12 años, 2 meses
Puntos: 2
Respuesta: Consulta con variable dentro del IN

por eso desde el formulario hasteun for ps

vb net

dim Codigos as string
Codigos = ""
For Each row1 As DataGridViewRow In MIDATAGRID.Rows
If row1.Cells("MICHEKBOX").Value = True Then
'RECUPERO EL VALOR Y AUMENTOUNA COMA
Codigos = Codigos + RECUPEROELVALOR + ","
End If
Next
'TODA LA CADENA Y QUITO LA ULTIMA COMA
Codigos = Mid(Codigos, 1, Codigos.Length - 1)
  #7 (permalink)  
Antiguo 29/08/2012, 10:32
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

Cita:
Iniciado por leochavez Ver Mensaje
TRATO DE USAR TUFUNCION Y ME SALE ERROR

SELECT * FROM ORDERS WHERE OrderID IN (
SELECT * FROM SplitApplication('10248,10249')
)
creaste la funcion??? que error te marca?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 29/08/2012, 10:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

Cita:
Iniciado por leochavez Ver Mensaje
por eso desde el formulario hasteun for ps

vb net

dim Codigos as string
Codigos = ""
For Each row1 As DataGridViewRow In MIDATAGRID.Rows
If row1.Cells("MICHEKBOX").Value = True Then
'RECUPERO EL VALOR Y AUMENTOUNA COMA
Codigos = Codigos + RECUPEROELVALOR + ","
End If
Next
'TODA LA CADENA Y QUITO LA ULTIMA COMA
Codigos = Mid(Codigos, 1, Codigos.Length - 1)
es mas sencillo con la funcion asi nada mas manda llamar la funcion con el parametro que necesita :)

jejeje se me paso una cosa la funcion se usa de la sig manera:


SELECT * FROM TABLE WHERE DATA IN (

SELECT data FROM SplitApplication('1,1,1,1')
)


saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 29/08/2012 a las 10:39
  #9 (permalink)  
Antiguo 29/08/2012, 11:37
 
Fecha de Ingreso: octubre-2003
Ubicación: Perú
Mensajes: 39
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: Consulta con variable dentro del IN

Muchas gracias Libras, funciono a la perfección es lo que estaba buscando
__________________
un conocimiento compartido es un conocimiento que evoluciona.
  #10 (permalink)  
Antiguo 29/08/2012, 11:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 29/08/2012, 11:51
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta con variable dentro del IN

Cambia el Select al siguiente:

Código SQL:
Ver original
  1. SELECT .....
  2. WHERE ','+@Valores+',' LIKE '%,'+CAST(NumConcepto AS VARCHAR)+',%';
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #12 (permalink)  
Antiguo 29/08/2012, 12:04
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

Cita:
Iniciado por GeriReshef Ver Mensaje
Cambia el Select al siguiente:

Código SQL:
Ver original
  1. SELECT .....
  2. WHERE ','+@Valores+',' LIKE '%,'+CAST(NumConcepto AS VARCHAR)+',%';
Podrias explicar tu query?

Porque quedaria

select * from tabla where ,1,2,3,4, like '%,1,2,3,4,%

no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 29/08/2012, 12:13
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta con variable dentro del IN

En la fila donde NumConcepto es 1 - el sistema intenta:
Código SQL:
Ver original
  1. WHERE ',1,2,3,4,' LIKE '%,1,%' --True
En la fila donde NumConcepto es 5 - el sistema intenta:
Código SQL:
Ver original
  1. WHERE ',1,2,3,4,' LIKE '%,5,%' --False
etcetera.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #14 (permalink)  
Antiguo 29/08/2012, 12:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

intente eso y esta consulta:

regresa digamos 100 registros

select * from tabla where ',dato,' like '%,dato,%'

mientras que esta solo 1

select * from tabla where name like '%dato%'

que estoy haciendo mal??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 29/08/2012, 12:30
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta con variable dentro del IN

Primero que nada crearemos tabla con los numeros 1-100:
Código SQL:
Ver original
  1. USE tempdb;
  2.  
  3. CREATE TABLE MiTabla(NumConcepto INT);
  4.  
  5. DECLARE @I INT;
  6. SET     @I=1;
  7. While   @I<=100
  8.         BEGIN
  9.         INSERT INTO MiTabla SELECT @I;
  10.         SET     @I=@I+1;
  11.         END

La recuperación:
Código SQL:
Ver original
  1. DECLARE @Valores VARCHAR(MAX);
  2. SET     @Valores='1,3,10,53,100';
  3.  
  4. SELECT  *
  5. FROM    MiTabla
  6. WHERE   ','+@Valores+',' LIKE '%,'+CAST(NumConcepto AS VARCHAR)+',%';
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #16 (permalink)  
Antiguo 29/08/2012, 13:02
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con variable dentro del IN

orale buen aporte :) muchas gracias por la explicacion :) pero prefieron mi funcion jejejeje es menos codigo al momento de implementarla :P pero tu codigo esta bien
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #17 (permalink)  
Antiguo 30/08/2012, 07:28
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Consulta con variable dentro del IN

Excelente GeriReshef, me parece buena idea cuando se tienen pocos valores en la tabla..

Esto porque la consulta hace un table scan, lo cual en tablas grandes (millones de registros) es algo critico... en estos casos lo mejor seria usar una función como la de Libras para poder agregar indices y permitir que el motor de SQL los utilice de forma optimizada..

De cualquier forma... me parece muy buen aporte..


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #18 (permalink)  
Antiguo 30/08/2012, 10:09
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta con variable dentro del IN

Si, el problema que yo le veo, es que en tablas super-grandes, siempre hara un TABLE SCAN y por ende, se tardaria demasiado en resolver el query.
__________________
MCTS Isaias Islas

Etiquetas: select, variables
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




La zona horaria es GMT -6. Ahora son las 20:03.