Table of contents
ALM
TOC
Collapse the table of content
Expand the table of content

Crear tabla a partir de un texto separado por comas (CSV)

Microsoft Community Publishing Service|Última actualización: 26/05/2017
|
1 Colaborador

Por FREDDY LEANDRO ANGARITA C.
SqlServer MVP
Perfil MVP / freddy_angarita@hotmail.com / http://geeks.ms/blogs/fangarita/default.aspx

En un artículo anterior, [Code] Crear una tabla a partir de un texto separado por comas (CSV), se presentó cómo realizar ésta tarea de la manera más simple, ahora, se complementará ésta solución presentando una alternativa que usa CTEs para realizar el trabajo recursivo de analizar las palabras en la sentencia

Usando la capacidad de las expresiones CTEs de crear iteraciones se permite la creación de la iteración consigo mismo, es decir en la primera parte, se pone la semilla y en la segunda parte (luego de union all) se implementa la iteración, la cual devuelve las posiciones inicial y final del texto al que se le va a aplicar substring:

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
    SELECT 1, 1, CHARINDEX(@sep, @s)
    UNION ALL
    SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
    FROM Pieces
    WHERE stop > 0
    )

    SELECT pn, SUBSTRING(@s, start, CASE WHEN stop >0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
)

La solución anterior presenta una forma interesante de aproximarse al problema pero aún usa recursión, esto se puede eliminar usando XML como base de análisis

CREATE FUNCTION \[dbo\].\[Split\] (@sep VARCHAR(32),
    @s VARCHAR(MAX))
RETURNS @t TABLE
    (
        val VARCHAR(MAX)
    )
AS
    BEGIN
        DECLARE @xml XML
    SET @XML = N'' + REPLACE(@s, @sep, '') + ''

    INSERT INTO @t(val)
    SELECT r.value('.','VARCHAR(255)') as Item
    FROM @xml.nodes('//root/r') AS RECORDS(r)

    RETURN
END

El truco consiste en convertir el texto, en un XML y luego usando el tipo de datos especial (y sus funciones) leemos la información como una tabla desde XML, el problema con esta solución es que tiene problemas de desempeño y se presenta solo como referencia

También se presenta uno de mis trucos favoritos el uso de la función dm_fts_parser, la cual permite realizar éste análisis rápidamente, con la ventaja de:

Ser una función del sistema,

Permitir configurar el idioma

Ser sensible al acentro y mayúsculas

Poder usar una lista de palabras a ignorar

Más funcionalidades

Select display_term from sys.dm_fts_parser('"' + 'Mi texto separado por espacios' + '"', 1033, 0,0)

Es ejemplo está para idioma inglés con el código 1033, para un listado completo se puede consultar el listado LCID

Espero sea de ayuda,

FREDY LEANDRO ANGARITA CASTELLANOSSQL Server MVP

© 2018 Microsoft