viernes, 2 de octubre de 2009

Función Split a Tabla SQL Server

Muchas personas que han solicitado esta función que había publicado hace unos meses atrás (bueno unos dos años), por lo que le hice unos cambios y la vuelvo a publicar, espero que les sirva de algo.

CREATE FUNCTION Split(@String varchar(150), @Delimiter char(1))
RETURNS @Results table (word varchar(50))
AS
BEGIN
DECLARE
@INDEX INT

DECLARE @SLICE varchar(200)
-- Asignar 1 a la variable que utilizaremos en el loop para no iniciar en 0.
SELECT @INDEX = 1

WHILE @INDEX !=0
BEGIN
-- Obtenemos el índice de la primera ocurrencia del split de caracteres.
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- Ahora ponemos todo a la izquierda de el slice de la variable.
IF @INDEX != 0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT
@SLICE = @STRING

insert into @Results(word) values(@SLICE)

SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- Salimos del loop si terminamos la búsqueda
IF LEN(@STRING) = 0 BREAK
END

RETURN
END

Pueden probarla ejecutandola de la siguiente manera:

SELECT * FROM dbo.split('miguel, manuel, maría, minerva',',')

Referencia a: Enlace

Espero les sirva,

1 comentario:

Anónimo dijo...

Buenas,

Estoy probando tu ejemplo, gracias por ponerlo y estoy haciendo una adaptación. Te cuento. Hago lo siguiente:

DECLARE @word VARCHAR(50)
DECLARE @i_PaisRealizacion CHAR(100)
SELECT @i_PaisRealizacion = '51,5,6'

DECLARE PaisRealiza CURSOR FOR
SELECT * FROM split(@i_PaisRealizacion,',')


OPEN PaisRealiza
FETCH NEXT FROM PaisRealiza
INTO @word

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Nombre: ' + @word
FETCH NEXT FROM PaisRealiza
INTO @word
END

CLOSE PaisRealiza
DEALLOCATE PaisRealiza
GO

El caso es que si hago esto me saca un solo print, del número 51,pero si en vez de la variable @i_PaisRealizacion pongo directamente la cadena '51,4...' si me los saca, y el caso es que no se por que

Gracias