[Code] Nueva versión crear tabla a partir de un texto separado por comas (CSV)

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 capacida 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 CASTELLANOS
Sql Server MVP

2 comentarios en “[Code] Nueva versión crear tabla a partir de un texto separado por comas (CSV)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *