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

Procedimiento almacenado

Estas en el tema de Procedimiento almacenado en el foro de SQL Server en Foros del Web. Hola a todos, ojala me pudieran ayudar con esto: tengo el siguiente Store Procedure: ALTER PROCEDURE sp_prueba @ids nvarchar(1000) as declare @nombres nvarchar(1000) set @nombres='' ...
  #1 (permalink)  
Antiguo 19/01/2010, 19:38
 
Fecha de Ingreso: enero-2010
Mensajes: 31
Antigüedad: 14 años, 10 meses
Puntos: 0
Procedimiento almacenado

Hola a todos, ojala me pudieran ayudar con esto:
tengo el siguiente Store Procedure:

ALTER PROCEDURE sp_prueba
@ids nvarchar(1000)
as
declare @nombres nvarchar(1000)
set @nombres=''
select @nombres= @nombres + nombre + ',' from Cliente where cast(id_cliente as nvarchar) in (@ids)
select @nombres
------------------------------------------------------------------------------------------------------
ahora para ejecutarlo lo siguente:

exec sp_prueba '''1'',''2''' ó exec sp_prueba '1,2'

y no me trae ningun registro...
y si solo le mando un valor en el parametro:
exec sp_prueba '1'

si me arroja registros de resultado
alguien podria ayudarme, muchas gracias

Última edición por ruben_zer0; 19/01/2010 a las 21:10
  #2 (permalink)  
Antiguo 20/01/2010, 08:31
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Procedimiento almacenado

porque supongo que no tienes clientes cuyo id sea = '1,2'



en realidad sql no lo toma como una lista sino como una variable con ese valor, por lo que tienes que convertirlo explicitamente a una tabla. Mas o menos seria asi:

Código:
ALTER PROCEDURE SP_PRUEBA
@IDS NVARCHAR(1000)
AS
DECLARE @NOMBRES NVARCHAR(1000)

SET @NOMBRES=''

DECLARE @CLIENT_IDS TABLE (CLIENTEID INT)

WHILE PATINDEX('%,%',@IDS)>0
BEGIN
	INSERT INTO @CLIENT_IDS (CLIENTEID) 
    VALUES (ISNULL(LEFT(@IDS,PATINDEX('%,%',@IDS)-1),0))

	SET @IDS = RIGHT(@IDS,LEN(@IDS)-PATINDEX('%,%',@IDS))
END

INSERT INTO @CLIENT_IDS(CLIENTEID) 
VALUES (ISNULL(@IDS,0))

SELECT @NOMBRES = @NOMBRES + NOMBRE + ',' 
FROM   @CLIENT_IDS I
INNER JOIN
      CLIENTE  C
ON    I.CLIENTEID = C.ID_CLIENTE

SELECT @NOMBRES

GO
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.

Última edición por Andres95; 20/01/2010 a las 08:42
  #3 (permalink)  
Antiguo 20/01/2010, 08:52
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: Procedimiento almacenado

Para no splitear el parámetro, no sería mejor que trabaje la consulta dinámicamente?
Código SQL:
Ver original
  1. SET @SQL = 'declare @nombres varchar(1000)
  2. select @nombres= @nombres + nombre + '',''
  3. from Cliente
  4. where id_cliente in (' + @ids + ')
  5. select @nombres'
  6. EXEC sp_executesql @SQL
ruben_zer0, por qué usas nvarchar y no vachar?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #4 (permalink)  
Antiguo 20/01/2010, 08:59
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Procedimiento almacenado

si, es otra opcion...




en lo personal, prefiero evitar lo mas posible el sql dinamico..



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.
  #5 (permalink)  
Antiguo 20/01/2010, 09:33
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Procedimiento almacenado

otra alternativa (para el que le pueda servir) es hacerlo con XML...(si tienes version 2000)

Código:
EXECUTE DBO.SP_PRUEBA @Id_XML = '<r><CUST id = "1" /><CUST id = "2" /></r>'


ALTER PROCEDURE SP_PRUEBA
    @Id_XML NVARCHAR(4000)
AS
DECLARE @NOMBRES NVARCHAR(1000)
DECLARE @idoc INT


----------------------------------------------------------
EXECUTE sp_xml_preparedocument @idoc OUTPUT, @Id_XML  
----------------------------------------------------------

SET @NOMBRES=''

SELECT       @NOMBRES = @NOMBRES + NOMBRE + ',' 
FROM         OPENXML (@idoc, '/r/CUST',1)  WITH ([ID_CLIENTE] INT '@id') AS I
INNER JOIN  CLIENTE C  
ON          I.ID_CLIENTE = C.ID_CLIENTE


----------------------------------------------------------
EXEC sp_xml_removedocument @idoc  
----------------------------------------------------------

SELECT @NOMBRES

GO
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.
  #6 (permalink)  
Antiguo 20/01/2010, 09:48
 
Fecha de Ingreso: enero-2010
Mensajes: 31
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Procedimiento almacenado

Gracias a todos por sus respuestas, realmente estoy haciendo un query dinamico y le anexe lo que puso andes95, cortando la cadena y guardando en una tabla temporal.
Gracias y saludos!
  #7 (permalink)  
Antiguo 20/01/2010, 10:53
 
Fecha de Ingreso: enero-2010
Mensajes: 31
Antigüedad: 14 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Procedimiento almacenado

Cita:
Iniciado por ruben_zer0 Ver Mensaje
Gracias a todos por sus respuestas, realmente estoy haciendo un query dinamico y le anexe lo que puso andres95, cortando la cadena y guardando en una tabla temporal.
Gracias y saludos!
  #8 (permalink)  
Antiguo 20/01/2010, 11:14
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Procedimiento almacenado

De nada...



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.

Etiquetas: procedimiento, almacenar
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 22:55.