none
Separar String RRS feed

  • Pregunta

  • Estimados.

    En un SS2008 tengo una columna que contiene datos separados por coma

    Ejemplo

    1,ROVER,1000,MARCA,2

    1,BMW,1000,MARCA,300

    Necesito separar en columnas los datos.

    Resultado 5 columnas:

    1 ROVER 1000 MARCA 2



    DBA SQL Server Santiago/Chile

    viernes, 14 de julio de 2017 21:51

Respuestas

  • La idea es separar la cadena en partes y escribir cada una de ellas en una columna distinta, la tarea es simple si se conoce "a priori" la cantidad de partes que tiene la cadena.

    - Función

    CREATE FUNCTION dbo.fnSepararCadena(@Texto nvarchar(max), @Separador nvarchar(4000)) 
        RETURNS @T TABLE (Id int IDENTITY(1,1), Valor nvarchar(max))
    AS
    BEGIN
        DECLARE @XML xml;
        SET @XML = N'<root><r>' + REPLACE(@Texto, @Separador,'</r><r>') + '</r></root>';
    
        INSERT INTO @T(Valor)
        SELECT
    	   r.value('.', 'varchar(max)') AS Item
        FROM 
    	   @XML.nodes('//root/r') AS records(r)
      RETURN
    END


    - Ejemplo de uso

    DECLARE @T table (Col nvarchar(100));
    INSERT INTO @T VALUES
        ('1,ROVER,1000,MARCA,2'),
        ('1,BMW,1000,MARCA,300');
    
    SELECT    
        MAX(CASE WHEN t2.F = 1 THEN t2.V END) AS Col1,
        MAX(CASE WHEN t2.F = 2 THEN t2.V END) AS Col2,
        MAX(CASE WHEN t2.F = 3 THEN t2.V END) AS Col3,
        MAX(CASE WHEN t2.F = 4 THEN t2.V END) AS Col4,
        MAX(CASE WHEN t2.F = 5 THEN t2.V END) AS Col5
    FROM
        @T t1
        CROSS APPLY (SELECT Valor, ROW_NUMBER() OVER(ORDER BY Id) 
    	   FROM dbo.fnSepararCadena(t1.Col, ',')) t2 (V, F)
    GROUP BY
        t1.Col;

    - Resultado


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 14 de julio de 2017 22:27