none
Trigger Separar en columnas RRS feed

  • Pregunta

  • Hola como  puedo hacer un Trigger que cuando inserte un registros a la tabla las siguiente cadena lo separe. Y las almacene en otras columnas.

    Ejemplo.

    8   ,47025,2016-06-13 00:00:00.000,1733,2
    8   ,43201,2016-06-13 00:00:00.000,1725,1
    8   ,43201,2016-06-13 00:00:00.000,2836,2
    8   ,43985,2016-06-13 00:00:00.000,2834,2
    8   ,44348,2016-06-13 00:00:00.000,0642,1
    8   ,44348,2016-06-13 00:00:00.000,1732,2


    Saludos!!!

    viernes, 24 de junio de 2016 20:02

Respuestas

  • - Cual version de SQL Server usas?

    - Desde donde pasas esa informacion, desde una aplicacion cliente?

    - Por que un trigger y no un procedimiento almacendado?

    http://www.sommarskog.se/arrays-in-sql.html


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP viernes, 24 de junio de 2016 20:22
    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:43
    viernes, 24 de junio de 2016 20:21
  • En ese link que te pase encontraras todo lo necesario para resolver tu problema.

    Ejemplo:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Itzik's VATN
    CREATE FUNCTION [dbo].[ufn_GetNums](@low AS bigint, @high AS bigint) 
    RETURNS table
    AS
    RETURN (
    WITH
    L0 AS (SELECT c FROM (VALUES(1),(1)) AS D(c)),
    L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
    L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
    Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum FROM L5)
    SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
    FROM Nums
    ORDER BY rownum
    );
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Erland's inline_split_me
    CREATE FUNCTION [dbo].[ufn_inline_split_me](@param nvarchar(MAX), @delimiter nchar(1) = N',')
    RETURNS table AS
    RETURN (
    SELECT
        ROW_NUMBER() OVER(ORDER BY n) AS pos,
        LTRIM(RTRIM(CONVERT(nvarchar(4000),
            SUBSTRING(@param, n,
                CHARINDEX(@delimiter COLLATE Slovenian_BIN2, @param + CONVERT(nvarchar(MAX), @delimiter), n) - n)))) AS Value
    FROM
        dbo.ufn_GetNums(1, LEN(@param))
    WHERE
        SUBSTRING(CONVERT(nvarchar(MAX), @delimiter) + @param, n, 1) = @delimiter COLLATE Slovenian_BIN2
    );
    GO
    DECLARE @T table (
    col1 int NOT NULL IDENTITY PRIMARY KEY,
    col2 varchar(128)
    );
    
    INSERT INTO @T (col2)
    VALUES
        ('8,47025,2016-06-13 00:00:00.000,1733,2'),
        ('8,43201,2016-06-13 00:00:00.000,1725,1'),
        ('8,43201,2016-06-13 00:00:00.000,2836,2'),
        ('8,43985,2016-06-13 00:00:00.000,2834,2'),
        ('8,44348,2016-06-13 00:00:00.000,0642,1'),
        ('8,44348,2016-06-13 00:00:00.000,1732,2');
    
    SELECT 
        T.col1,
        T.col2,
        U.pos,
        U.Value 
    FROM
        @T AS T
        CROSS APPLY
        dbo.ufn_inline_split_me(T.col2, N',') AS U
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:43
    lunes, 27 de junio de 2016 13:53

Todas las respuestas

  • Puedes utilizar la función SubString() para separar la cadena en subcadenas y enviarlo a la columna correspondiente
    viernes, 24 de junio de 2016 20:20
  • - Cual version de SQL Server usas?

    - Desde donde pasas esa informacion, desde una aplicacion cliente?

    - Por que un trigger y no un procedimiento almacendado?

    http://www.sommarskog.se/arrays-in-sql.html


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP viernes, 24 de junio de 2016 20:22
    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:43
    viernes, 24 de junio de 2016 20:21
  • Hola esa información la importo de un archivo csv y de ahí la cargo por un sistema que me permite hacer importacion.

    como no conosco mucho no se como tratar la cadena, manejo un procedimiento almacenado para importar y pues pense mejor con un triguer para que separe.

    mi version es la 2012

    Saludos!!!

    viernes, 24 de junio de 2016 20:25
  • En ese link que te pase encontraras todo lo necesario para resolver tu problema.

    Ejemplo:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Itzik's VATN
    CREATE FUNCTION [dbo].[ufn_GetNums](@low AS bigint, @high AS bigint) 
    RETURNS table
    AS
    RETURN (
    WITH
    L0 AS (SELECT c FROM (VALUES(1),(1)) AS D(c)),
    L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
    L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
    Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum FROM L5)
    SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
    FROM Nums
    ORDER BY rownum
    );
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Erland's inline_split_me
    CREATE FUNCTION [dbo].[ufn_inline_split_me](@param nvarchar(MAX), @delimiter nchar(1) = N',')
    RETURNS table AS
    RETURN (
    SELECT
        ROW_NUMBER() OVER(ORDER BY n) AS pos,
        LTRIM(RTRIM(CONVERT(nvarchar(4000),
            SUBSTRING(@param, n,
                CHARINDEX(@delimiter COLLATE Slovenian_BIN2, @param + CONVERT(nvarchar(MAX), @delimiter), n) - n)))) AS Value
    FROM
        dbo.ufn_GetNums(1, LEN(@param))
    WHERE
        SUBSTRING(CONVERT(nvarchar(MAX), @delimiter) + @param, n, 1) = @delimiter COLLATE Slovenian_BIN2
    );
    GO
    DECLARE @T table (
    col1 int NOT NULL IDENTITY PRIMARY KEY,
    col2 varchar(128)
    );
    
    INSERT INTO @T (col2)
    VALUES
        ('8,47025,2016-06-13 00:00:00.000,1733,2'),
        ('8,43201,2016-06-13 00:00:00.000,1725,1'),
        ('8,43201,2016-06-13 00:00:00.000,2836,2'),
        ('8,43985,2016-06-13 00:00:00.000,2834,2'),
        ('8,44348,2016-06-13 00:00:00.000,0642,1'),
        ('8,44348,2016-06-13 00:00:00.000,1732,2');
    
    SELECT 
        T.col1,
        T.col2,
        U.pos,
        U.Value 
    FROM
        @T AS T
        CROSS APPLY
        dbo.ufn_inline_split_me(T.col2, N',') AS U
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta José De Alva jueves, 30 de junio de 2016 14:43
    lunes, 27 de junio de 2016 13:53