Script Split Base de datos

Hoy voy a publicar una función que utilizo para realizar split en SQL Server 2000 recomendables para realizar búsquedas de cadenas, nombres, entre otras.

CREATE FUNCTION Split(@String varchar(150), @Delimiter char(1))
RETURNS varchar(200)
AS
BEGIN
DECLARE @INDEX INT
DECLARE @Results varchar(200)
DECLARE @SLICE varchar(200)
-- Asignar 1 a la variable que utilizaremos en el loop para no iniciar en 0.
SELECT @INDEX = 1
-- Asignar Results = '' para no devolver null y prevenir errores.
SET @Results = ''
IF @String IS NULL RETURN @Results

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

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

RETURN @Results --Retornamos el resultado de la misma
END

Comentarios

Unknown ha dicho que…
Guru...se puede adaptar esta funcion Split para mySQL ?

Gracias! la necesito mucho
Michael Núñez ha dicho que…
Saludos Roberto,

De seguro que si se puede, enviame tu correo para enviartela para MySql a elymichael@gmail.com
Unknown ha dicho que…
HOLA SOY NUEVA EN EL TEMA
miren necesito separar la siguiente cadena AREA-FONO-FECHA_NOMBre necesito que area , fono, fech,nombre queden en diferentes columnas en sql server como hago eso porfa si me puedes ayudar estare muy agradecida
Michael Núñez ha dicho que…
Saludos Valeria,

Lo primero seria tener los delimitadores estandarizados, es decir, si vas a usar "-", delimitar lo que desees con eso, luego ejecutas la funcion

"select dbo.Split('AREA-FONO-FECHA-NOMBRE','-')"

y obtendras lo que deseas,

Espero te ayude
Anónimo ha dicho que…
Al ejecutar "select dbo.Split('AREA-FONO-FECHA-NOMBRE','-')"
sólo me retorna el mismo string pero reemplanzando '-' por '%'.

Plop !

¿Qué estoy haciendo mal?
Anónimo ha dicho que…
Hola

Yo denuevo... el siguiente link tiene un split que retorna registros con los valores del string separados..

revísenlo:
http://geekswithblogs.net/AngelEyes/archive/2007/04/12/111504.aspx
Angela Escobar ha dicho que…
hola sera que esta funcion se puede adaptar para Firebird???
Gracias
Michael Núñez ha dicho que…
Hola Angela

No conozco Firebird, pero me imagino que no debe ser muy complicado, ya que está diseña en más de un 80% en SQL puro, voy a investigar un poco y te dejo saber.
ayceleste ha dicho que…
CREATE PROCEDURE FN_SPLIT(IN STR VARCHAR(4000),IN DELIMITADOR VARCHAR(1))
BEGIN

DECLARE POS INT;
DECLARE NEXTPOS INT;
DECLARE VALOR VARCHAR(100);
DECLARE LEN INT;
SET NEXTPOS = 0;
SET LEN = CHAR_LENGTH(STR) -1;
SET POS=0;

DROP TEMPORARY TABLE IF EXISTS TEMP;

CREATE TEMPORARY TABLE IF NOT EXISTS TEMP(
VAL VARCHAR(100)
) ;
SET VALOR = SUBSTRING_INDEX(STR,DELIMITADOR,1);
INSERT INTO TEMP SELECT VALOR;
WHILE NOT POS > LEN + 2 DO
SET STR = SUBSTRING(STR,CHAR_LENGTH(VALOR)+2,LEN-CHAR_LENGTH(VALOR));
SET POS = POS + CHAR_LENGTH(VALOR)+2;
SET VALOR = SUBSTRING_INDEX(STR,DELIMITADOR,1);
INSERT INTO TEMP SELECT VALOR;
END WHILE;
SELECT * FROM TEMP;
END
Michael Núñez ha dicho que…
Vaya, se ve interesante esa función, al parecer es para SQL 2005. Si tienes más información al respecto me dejas saber.
Michael Núñez ha dicho que…
Otra forma de implementar la función, esta retorna una tabla, por el momento solo funciona con SQL Server 2005.

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
Muchas Gracias por el codigo, le hice algunas modificaciones para mi fin.
Arcangel Asesino ha dicho que…
podrías pasarme la versión de Mysql tambien mi correo es Angel_asesino@hotmail.com gracias ...
me arias un mega favor
Michael Núñez ha dicho que…
Buenas,

La versión de MySQL que tenía para estas pruebas era la 5.0
Unknown ha dicho que…
Gracias, me ayudó bastante
:)
Unknown ha dicho que…
Gracias, me ayudó la función :)

Entradas populares de este blog

Como ejecutar una aplicación desde SQL.

Crear un Cursor SQL Server

Desahogo