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,
Agenda 24 enero, 2012 Sharing the Poing, South America 2012 Evento en Latinoamérica sobre SharePoint
Agenda 24 enero, 2012 Sharing the Poing, South America 2012 Evento en Latinoamérica sobre SharePoint