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

dividir registros de Función Escalar

Estas en el tema de dividir registros de Función Escalar en el foro de SQL Server en Foros del Web. Hola a todos, les explico mi problema. Hace poco hice una función escalar que me eliminaba caracteres extraños de un campo de una tabla, me ...
  #1 (permalink)  
Antiguo 07/07/2011, 07:37
 
Fecha de Ingreso: junio-2011
Ubicación: La Habana
Mensajes: 22
Antigüedad: 11 años
Puntos: 0
dividir registros de Función Escalar

Hola a todos, les explico mi problema. Hace poco hice una función escalar que me eliminaba caracteres extraños de un campo de una tabla, me explico, por problemas de integración shareopoint - SQL al guardar en SQL elementos de sharepoint sacados del active directory por ejemplo varios usuarios del dominio se guaradn en este formato:

#123#Nombre1,#45#Nombre2 (1er registro)
#68#Nombre3,#987#Nombre4 (2do registro)

bueno logre que al hacer el select con esa funcion escalar me devuelva:

Nombre1, Nombre2
Nombre3, Nombre4

lo que quiero ahora es como devolver todos los registros separados, es decir:

Nombre1
Nombre2
Nombre3
Nombre4

No sé si me he explicado detalladamente, si tienen alguna duda de lo que quiero me escriben y les explicaré más.

Gracias de antemano
  #2 (permalink)  
Antiguo 08/07/2011, 01:34
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: dividir registros de Función Escalar

podrias hacer algo con charindex

Código SQL:
Ver original
  1. SELECT SUBSTRING(campo,1, charindex(',',campo)) FROM tabla
  2. UNION
  3. SELECT SUBSTRING(campo, charindex(',',campo)+1,len(campo) ) FROM tabla

Aclaro, es una forma de hacerlo, puede que haya mejores.
  #3 (permalink)  
Antiguo 08/07/2011, 06:26
 
Fecha de Ingreso: junio-2011
Ubicación: La Habana
Mensajes: 22
Antigüedad: 11 años
Puntos: 0
Respuesta: dividir registros de Función Escalar

Gracias Josh por tu rápida respuesta, algo así ya lo había intentado pero el problema en ese código es cuando en uno de los registros solo hay una persona, me explico.

si tengo:

Shael, Pepe, Alejandro
Leila, Ale

Funciona a la perfección

Ahora si tengo:

Shael
Pepe, Alejandro
Leila
Ale, Cristina

No pincha!!! ya que el charindex no encuentra la coma en el primer registro. Si tienes alguna idea para esto, estaré más que agradecido!!!.
  #4 (permalink)  
Antiguo 08/07/2011, 07:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 10 meses
Puntos: 774
Respuesta: dividir registros de Función Escalar

Utiliza un case

select
case
when
charindex(',',campo) is not null then
substring(campo,1, charindex(',',campo))
else campo end as campo from tabla


Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 08/07/2011, 13:51
 
Fecha de Ingreso: junio-2011
Ubicación: La Habana
Mensajes: 22
Antigüedad: 11 años
Puntos: 0
Respuesta: dividir registros de Función Escalar

Saludos libras y gracias por la sugerencia pero la cosa es que el "campo" no es un campo de una tabla sino una función escalar, pongo mi codigio para que vean

select
case
when
charindex(';',dbo.splitnew(Participantes,'#')) is not null then
substring(dbo.splitnew(Participantes,'#'),1, charindex(';',dbo.splitnew(Participantes,'#')))
else dbo.splitnew(Participantes,'#') end as responsable from SLAM.Acuerdos_CD

donde dbo.splitnew(Participantes,'#') es una función escalar que hice para quitar los caracteres raros que salian como explique al principio. Bueno la cosa es que no me funciona con esa función implicita ahí.

La otra idea es recorrer el resultado del llamado a esa función que seria en otra función o en un procedimiento almacenado, pero no estoy ducho en eso. Si a alguien se le ocurre alguna idea, soy todo oido o mejor vista. Gracias de antemano
  #6 (permalink)  
Antiguo 09/07/2011, 02:26
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: dividir registros de Función Escalar

mmmm mira yo tengo la siguiente funcion:


Código SQL:
Ver original
  1. CREATE FUNCTION SplitN(@campo VARCHAR(150), @clave CHAR(1))
  2.     RETURNS VARCHAR(8000)
  3. BEGIN
  4.     DECLARE @indice INT
  5.     DECLARE @indice2 INT
  6.     DECLARE @resultado VARCHAR(8000)
  7.     DECLARE @tmp VARCHAR(200)
  8.     SELECT @indice = 1
  9.     SET @resultado = ''
  10.     IF @campo IS NULL RETURN @resultado
  11.     WHILE @indice !=0
  12.     BEGIN
  13.         SELECT @indice = CHARINDEX(@clave,@campo)
  14.         SELECT @indice2 = CHARINDEX(@clave,@campo,@indice+1)
  15.         IF @indice2=0
  16.             SELECT @indice2 = len(@campo)
  17.         IF @indice != 0
  18.         BEGIN
  19.             SELECT @tmp = SUBSTRING(@campo,@indice,@indice2)
  20.             SELECT @tmp = REPLACE(@campo,@tmp,'')
  21.             SELECT @tmp = SUBSTRING(@campo,1,CHARINDEX(@clave,@campo) -1)
  22.         END
  23.         ELSE
  24.             SELECT @tmp = @campo
  25.         SET @resultado = @resultado + @tmp
  26.         SELECT @campo =  SUBSTRING(@campo,@indice2+1,len(@campo))
  27.         IF LEN(@campo) = 0 BREAK
  28.     END
  29.     RETURN @resultado
  30. END
  31. GO

ok ?


bueno, si hago lo siguiente:
Código SQL:
Ver original
  1. DROP TABLE #tabla
  2. GO
  3. CREATE TABLE #tabla
  4. (
  5.     Participantes VARCHAR(50)
  6. )
  7.  
  8. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre1,#45#Nombre2')
  9. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre3,#45#Nombre4')
  10. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre5,#45#Nombre6')
  11. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre7,#45#Nombre8')
  12. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre9')
  13. INSERT INTO #tabla (Participantes) VALUES('#123#Nombre10,#45#Nombre11,#45#Nombre12')
  14. INSERT INTO #tabla (Participantes) VALUES('Nombre13')
  15.  
  16. DECLARE @str VARCHAR(8000)
  17.     SET @str = ' select dbo.SplitN( PArticipantes, ''#'')+'','' as [Participantes] from #tabla '
  18. DECLARE @str2 VARCHAR(8000)
  19.     SET @str2 = ' SELECT substring(Participantes,1, charindex('','',Participantes)) as [Participantes] FROM ('+ @str +')A  union '
  20.     SET @str2 = @str2 +' SELECT substring(Participantes, charindex('','',Participantes)+1,len(Participantes)) as [Participantes] FROM ('+ @str +')A'
  21.  
  22. DECLARE @str3 VARCHAR(8000)
  23.     SET @str3 = ' SELECT substring(Participantes,1, charindex('','',Participantes)) as [Participantes] FROM ('+ @str2 +')A  union '
  24.     SET @str3 = @str3 +' SELECT substring(Participantes, charindex('','',Participantes)+1,len(Participantes)) FROM ('+ @str2 +')A'
  25.  
  26. DECLARE @str4 VARCHAR(8000)
  27.     SET @str4 = ' SELECT substring(Participantes,1, charindex('','',Participantes)) as [Participantes] FROM ('+ @str3 +')A  union '
  28.     SET @str4 = @str4 +' SELECT substring(Participantes, charindex('','',Participantes)+1,len(Participantes)) as [Participantes] FROM ('+ @str3 +')A'
  29.  
  30. EXEC('Select replace(Participantes,'','','''') From ('+ @str4+')B where Participantes<>''''')

Me da los resultados


Código Resultado:
Ver original
  1. Nombre1
  2. Nombre10
  3. Nombre11
  4. Nombre12
  5. Nombre13
  6. Nombre2
  7. Nombre3
  8. Nombre4
  9. Nombre5
  10. Nombre6
  11. Nombre7
  12. Nombre8
  13. Nombre9

Checala y me dices que onda, si te sirve o cualquier duda.


No es la mejor forma tal ves, pero es lo primero que se me vino a la mente.
  #7 (permalink)  
Antiguo 11/07/2011, 06:20
 
Fecha de Ingreso: junio-2011
Ubicación: La Habana
Mensajes: 22
Antigüedad: 11 años
Puntos: 0
Respuesta: dividir registros de Función Escalar

Joch_pa gracias por tu ayuda, la función que expones esta muy bien al igual que la ejecución del código pero solo veo que lo haces para cuando sabes la cant de registros que tiene la tabla y yo no, si se te ocurre algo para esto me avisas o si no estoy claro y si funciona para todos los registros posibles tambien me lo aclaras. Ah y si de paso me puedes explicar que significan las letras A y B que estan detrás de las variables puestas en el exec:

('+ @str +')A

('+ @str4+')B

Disculpa la ignorancia es que SQL no es mi fuerte. y Gracias por las molestias!!!
  #8 (permalink)  
Antiguo 11/07/2011, 23:34
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: dividir registros de Función Escalar

Cita:
Iniciado por shael Ver Mensaje

('+ @str +')A

('+ @str4+')B
Es como una subconsulta, el nombre real no me lo se, lo que hace es hacer un select y ponerlo como tabla temporal, todo ese select, la A y la B son el alias de esa tabla temporal

a lo demas te entiendo perfectamente, pero no me surge una idea de como hacerlo por si hay varias comas en el registro.

Alguien que pase por aqui y sepa como resolverlo nos ayudará

Etiquetas: dividir, escalar, registros, sql, tabla, campos
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 06:50.