SQL Server - SEPARAR CAMPO STRING A FILAS

 
Vista:
sin imagen de perfil

SEPARAR CAMPO STRING A FILAS

Publicado por Gray (6 intervenciones) el 20/08/2015 01:10:54
Hola buena tarde,

Estoy tratando de separar un campo a filas, ejemplo:
Esta es mi tabla A
PopId Specification
406575 00001B |00017TK|00021AL|00022BA|00031B |00035Z |00037A |00067Z
406942 00001B |00017TK|00021AL|00022BA|00031B |00035Z |00037A |00067Z |00072A
408410 00001B |00017TU|00021AL|00022AZ|00031B |00035Z |00037C |00067Z |00072A


Quiero que me inserte el valor de Specificacion
tabla B
PopId Specification
406575 00001B
406575 00017TK
406575 00022BA
406575 00031B


.........N





creo que es algo así, alguna idea??


CREATE FUNCTION [dbo].[Template_Musys]
(
@string NVARCHAR(MAX),
@delimiter varchar('|')
)
RETURNS @output TABLE(Specification NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1

INSERT INTO @output (Specification)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)

END
RETURN
END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 86
Ha disminuido su posición en 2 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

SEPARAR CAMPO STRING A FILAS

Publicado por Rafael (110 intervenciones) el 20/08/2015 11:55:06
Casi casi lo tienes te doy la solución:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE FUNCTION Template_Musys
(
    @string NVARCHAR(MAX),
    @delimiter char(1)
)
RETURNS @output TABLE(Specification NVARCHAR(MAX))
BEGIN
    DECLARE @start INT, @end INT
 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
    WHILE @start < LEN(@string) + 1
    BEGIN
        IF @end = 0
        SET @end = LEN(@string) + 1
 
        INSERT INTO @output (Specification)
        VALUES(SUBSTRING(@string, @start, @end - @start))
        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @string, @start)
 
    END
    RETURN
END

Cuando lo ejecutas seria algo asi:
1
2
Select *
from Template_Musys('406575 00001B |00017TK|00021AL|00022BA|00031B |00035Z |00037A |00067Z', '|');

Aqui el resultado:
Imagen

Ya nos contaras...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SEPARAR CAMPO STRING A FILAS

Publicado por Gray (6 intervenciones) el 20/08/2015 20:24:00
Gracias Rafael, casi es como lo necesito pero al correrlo que sea automático me arroje
el PopId y en otro campo desglosadas sus Especificaciones.

ADJUNTO MI TABLA ORIGINAL
ejemplo

EJEMPLO RESULTADO DESEADO :
Pop Id con N especificaciones.

PopId Specification
96925 00001B
96925 00017TU
96925 00021AL
96925 00022AZ
96925 00031B
96925 00035Z
96925 00037C
96925 00067Z
97346 00072A
97346 00079G
97346 00095AK
97346 00098B
97346 00105Z
97346 00109Z
97346 00111F
97346 00119A
97346 00142H
97346 00160Z
97353 00160Z
97353 00290A
97353 00310B
97353 00324Z
97353 00387A
97353 00392B
97353 00397Z
97353 00403B
97353 00404B
97353 00408LX
97353 00420L
97353 00429C
97353 00439B
97353 00441BB
97353 00448A
97353 00466C
97353 00472E
96945 00492Z
96945 00510C


No se si exista la forma :(


]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 86
Ha disminuido su posición en 2 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

SEPARAR CAMPO STRING A FILAS

Publicado por Rafael (110 intervenciones) el 24/08/2015 14:51:09
Tendrias que meterlo en un LOOP con lo que puede tardar en resolverse dependiendo de la cantidad de registros en la tabla original.

Pero seria algo asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CREATE FUNCTION Template_Musys ()
RETURNS @output TABLE(PopId int, Specification NVARCHAR(MAX))
BEGIN
    DECLARE @start INT
          , @end INT
          , @popid INT
          , @Specification NVARCHAR(MAX)
          , @delimiter char(1)
 
    SET @delimiter = '|'
 
    DECLARE datos CURSOR
    FOR SELECT POPID
             , SPECIFICATION
        FROM TEST_TABLE
 
    OPEN Datos
 
    FETCH NEXT FROM datos
    INTO @popid, @Specification
 
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @start = 1, @end = CHARINDEX(@delimiter, @Specification)
        WHILE @start < LEN(@Specification) + 1
        BEGIN
            IF @end = 0
            SET @end = LEN(@Specification) + 1
 
            INSERT INTO @output (PopId, Specification)
            VALUES(@popid, SUBSTRING(@Specification, @start, @end - @start))
            SET @start = @end + 1
            SET @end = CHARINDEX(@delimiter, @Specification, @start)
        END
 
        FETCH NEXT FROM datos
        INTO @popid, @Specification
    END
 
    CLOSE datos
    DEALLOCATE datos
    RETURN
END


Su ejecución:
1
2
Select *
from Template_Musys();

Por lo que podrias modificarle para recibir parámetros y limitar la consulta a solo algunos registros;
Aqui la ejecucion
Imagen

Ya si te sirve y no te es molesto poner un mas 1 o calificar la intervencion no viene mal...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

SEPARAR CAMPO STRING A FILAS

Publicado por Gray (6 intervenciones) el 24/08/2015 18:22:37
Justo lo que necesito.

Muchas gracias Rafael :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar