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

problema de concatenacion

Estas en el tema de problema de concatenacion en el foro de SQL Server en Foros del Web. hola , que tal tengo un gran problema , casi no se de Sql, pero quero saber como puedo almacenar el resulatdo de una consulta ...
  #1 (permalink)  
Antiguo 05/12/2006, 11:25
Avatar de dianatorres  
Fecha de Ingreso: diciembre-2006
Mensajes: 26
Antigüedad: 17 años, 5 meses
Puntos: 0
problema de concatenacion

hola , que tal tengo un gran problema , casi no se de Sql, pero quero saber como puedo almacenar el resulatdo de una consulta en una variable, lo que pasa es que no se si me doi a entender

quiero recorrer la tabla desde el sql , no se si se pueda ?
me dan opciones que desde codigo de visual.net , pero eso no es lo que busco

digamos tengo
select clienteactivos from clientes where ciudad='mty'
me trae

clienteactivos
-------------
Raul
Pedro
Claudia
Myrna
Sandra
Carmen

lo que io quiero es que todo este resultado me lo pueda almacenar en una variable concatenados, pero que toda esta operacion la haga solo en el sql

@variable = Raul,Pedro,Claudia,Myrna,Sandra,Carmen
ayudenme porfavor
  #2 (permalink)  
Antiguo 05/12/2006, 13:13
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 6 meses
Puntos: 8
Que tal Diana.

Mediante una sentencia SQL no esposible obtener los resultados como indicas, al menos en SQL Server 2000, nosé para 2005.

Pasando a lo que necesitas, puedes recorrer el resultado de una consulta usando CURSORES.

Como en el siguiente ejemplo:


Código:
DECLARE @lstClientesActivos varchar(8000)
DECLARE @lstClienteActivo varchar(100)
DECLARE curCliente CURSOR FOR
SELECT clienteactivos from clientes where ciudad='mty'


OPEN curCliente 

SET @lstClientesActivos =''
FETCH NEXT FROM curCliente 
INTO @lstClienteActivo
 
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @lstClientesActivos = @lstClientesActivos  + @lstClienteActivo  + ','
    FETCH NEXT FROM curCliente 
    INTO @lstClienteActivo 
END

CLOSE curCliente 
DEALLOCATE curCliente 

-- quitar la última coma
If Len(@lstClientesActivos ) > 0 
  @lstClientesActivos  = Substring(@lstClientesActivos, Len(@lstClientesActivos)-1)
En resumen para usar un cursor pasas por las siguientes fases:

Declararlo.
DECLARE curCliente CURSOR FOR
SELECT clienteactivos from clientes where ciudad='mty'

Abrirlo: OPEN curCliente

Avanzar al siguiente registro y vaciar a variables:
FETCH NEXT FROM curCliente
INTO @lstClienteActivo

Preguntar sino esta en el fin del cursor:
@@FETCH_STATUS = 0

Y por último, cerrar y liberar el cursor:
CLOSE curCliente
DEALLOCATE curCliente

Espero haber sido claro y consiso.

Saludos y suerte!
  #3 (permalink)  
Antiguo 05/12/2006, 17:52
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Una manera sencilla de lograrlo es:

DECLARE @cadena VARCHAR(1000)
SET @cadena = ''
SELECT @cadena = @cadena + nombre + ';' FROM tabla

Pero OJO, esto es una forma no estándar de uso y dependiendo de la complejidad del SELECT puede no entregar los resultados esperados debido a tareas que hace el optimizador. Pero para selects llanos como el del ejemplo siempre me funciona.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #4 (permalink)  
Antiguo 05/12/2006, 18:24
Avatar de dianatorres  
Fecha de Ingreso: diciembre-2006
Mensajes: 26
Antigüedad: 17 años, 5 meses
Puntos: 0
hola Daniel00 eres un super genio si me saliooo!!!1 gracias , gracias , graciass
lo unico que si me marco un error pues fue al momento de quitar la coma final , me dice ke espera el substring 3 argumento =( sabee porque
pero Gracias Eres Excelente!! (y)
  #5 (permalink)  
Antiguo 05/12/2006, 18:25
Avatar de dianatorres  
Fecha de Ingreso: diciembre-2006
Mensajes: 26
Antigüedad: 17 años, 5 meses
Puntos: 0
mithrandir gracias tambien tomare en cuenta tu respuesta =)
  #6 (permalink)  
Antiguo 05/12/2006, 19:48
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Excelente!

Amigo Mithrandir, suena muy básico, pero en verdad que esa no me la sabia! jeje un Saludo!
  #7 (permalink)  
Antiguo 06/12/2006, 11:07
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Excelente!

Cita:
Iniciado por Gabo77 Ver Mensaje
Amigo Mithrandir, suena muy básico, pero en verdad que esa no me la sabia! jeje un Saludo!
Es lógico de pensar en armar algo así en los lenguajes estándar, pero en el modelo relacional no es algo que salga naturalmente. Yo tampoco lo imaginé hasta que lo vi publicado en una lista de correo.

Pero insisto, ojo que no es una implementación tradicional y con querys de mediana complejidad ya no entrega los resultados esperados.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 06/12/2006, 19:53
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: problema de concatenacion

Nop, pero siempre tiene la opcion de que el resultado de un Query complejo lo metas a una temporal, y de esa temporal haces esta consulta sencilla y practica, cualquier cosa por no hacer un Cursor!!

Saludos!
  #9 (permalink)  
Antiguo 12/05/2007, 07:09
Avatar de marceloSQL  
Fecha de Ingreso: mayo-2007
Ubicación: Buenos Aires, San Isidro
Mensajes: 4
Antigüedad: 17 años
Puntos: 0
Re: problema de concatenacion

Muchas Gracias por todas las respuestas, me han sido de gran utilidad, ya que desconocia como avanzar al siguiente registro, hans sido muy ilustrativos y pedagogicos con los ejemplos y las explicaciones. Gracias
  #10 (permalink)  
Antiguo 13/05/2007, 08:40
Avatar de marceloSQL  
Fecha de Ingreso: mayo-2007
Ubicación: Buenos Aires, San Isidro
Mensajes: 4
Antigüedad: 17 años
Puntos: 0
De acuerdo Re: problema de concatenacion

/*12 de mayo de 2007*/
/* Programa _prgNumeracionRemitos
CONCEPTOS: CURSORES, CABECERA DETALLE, CONCATENACION, INSERT
SIMULTANEO entre tablas

Autor: Marcelo Di Deo - [email protected]

Fecha de Creacion: Sabado 12 de Mayo de 2007
Tiempo estimado de aprendizaje teorico: 12 horas
Tiempo para implementacion: 2 horas
Me he basado en el ejemplo que dio Daniel donde explica como moverse en un cursor, y he agregado un recurso que ayudara a quienes deban trabajar con tablas CABECERA DETALLE
reemplazando el viejo metodo COBOL, Pascal o clipper de Corte de Control.

Si alguien cree que es un ejemplo muy burdo, por favor sepan disculpar. Creanme, es mi primer programa estructurado de SQL. Solo sabia hacer las operaciones basicas de SP para ABM , o traer un select y pasarlo via XML

Proposito: Generar la cabecera a partir de un conjunto de registros detalle
Si se quiere llamar Tablas Padre-HIJO/HIJA, CABECERA-DETALLE.
Estos registros detalle estan el la tabla PrestacionesGrabadas
La Cabecera esta en la tabla Remitos.
Para preparar los datos del registro CABECERA se genera un cursor
que pretende realizar un calculo que en DOS lo doy con cortes de control previamente a preparar los datos con un indice al efecto.

En lo que respecta exclusivamente al proposito particular, para el caso de facturacion
por cuenta y orden en un circulo medico, se logra Numerar Remitos en un rango
conocido de prestaciones grabadas.
Comentarios: A diferencia de otros

CONCLUSION: Si no lo valoro, otro se estara aprovechandose de mi esfuerzo.
VALORO MI ESFUERZO
Esto es lo que el foro tiene en consecuencia de un conjunto de buenas acciones Ojala podamos continuar aportando

Doy garantia que funciona eficientemente. Las pruebas las estoy haciendo sobre una tabla de mas de 4.000.000 de registros y procesa en menos de 5 segundos.

Leer por favor el PROPOSITO para entender todos los pasos siguientes

*/

Begin Transaction
DECLARE
@nidEstado Int,
@nIdObraSocial Int,
@nAno Int,
@nMes Int,
@nTotalHonorarios Dec(9,3),
@nTotalGastos Dec(9,3),
@i Int,
@nTope Int,
@nNuevoId Int,
@cDescripcion VarChar(80)

Declare CurRemitos
CURSOR FOR
SELECT
idObraSocial idObraSocial,
Year(FechaPrestacion) Ano,
Month(FechaPrestacion) MES,
Sum (ImporteHonorarios) TotalHonorarios,
Sum (ImporteGastos) TotalGastos
from
Nexus7.dbo.PrestacionesGrabadas
Group By idObraSocial,
Month(FechaPrestacion),
Year(FechaPrestacion)


/* "USA" el cursor, y coloca el puntero al tope (No en el primer registro sino en el "TOP" */
OPEN curRemitos

/* Lee siguiente registro (SKIP), asignando cada campo a variables previamente declaradas*/
FETCH NEXT FROM curRemitos INTO
@nidObraSocial,
@Ano,
@nMes,
@nTotalHonorarios,
@nTotalGastos

/* Gracias a Daniel aprendi que la funcion @@FETCH_SATUS es comparable a FIN DE ARCHIVO "EOF"
Para CLIPPEROS-FOXEROS como yo viene a ser "EOF()"
Proposito: Mientras recorro el Cursor, con los datos calculados del mismo voy
haciendo un Insert en otra tabla de la base de datos donde trabajo o
bien en otra, de acuerdo al prefijo que corresponda en "DBO"
*/
WHILE @@FETCH_STATUS = 0
BEGIN
print 'hola'+str(@nidObraSocial)
/*Hago el Insert del proposito declarado arriba en una tabla cualquiera
Leyendo los calculos que ya hizo el cursor*/
Insert into nexus7.dbo.Remitos (
idObraSocial, ImporteHonorarios,
ImporteGastos,
PeriodoProceso
)
Values
(
@nIdObraSocial,
@nTotalHonorarios,
@nTotalGastos,
@nAno+@nMes
)
/* Tomo el id que me dio este insert, ya que ese ID lo debo grabar en la tabla hija Entonces se muestra otro ejemplo con tablas Cabecera-Detalle o bien Padres-Hijas*/

set @nNuevoId = @@identity

/* Con dicho ID reemplazo en la tabla hija de */
update nexus7.dbo.PrestacionesGrabadas
set idRemito = @nNuevoID
where idObraSocial = @nNuevoId and
year(FechaPrestacion) = @nAno and
Month(FechaPrestacion) = @nMes

/* Leo proximo registro del cursor */
FETCH NEXT FROM curRemitos INTO
@nidObraSocial,
@nAno,
@nMes,
@nTotalHonorarios,
@nTotalGastos
End

/*Cierro y limpio cursor*/
CLOSE curRemitos
DEALLOCATE curRemitos

/* Consolido la Transaccion*/
commit transaction

ACEPTO TODO TIPO DE CRITICAS O CORRECCIONES ya que es mi primer programa.
Para quien necesite, presto humildemente mi colaboracion
  #11 (permalink)  
Antiguo 15/05/2007, 11:50
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: problema de concatenacion

A nivel muy superficial diré que se ve bien siempre y cuando sea para ilustrar el uso de cursores. En la práctica hay que evitarlos tanto como sea posible.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
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 19:25.