miércoles, 24 de octubre de 2007

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

16 comentarios:

Roberto dijo...

Guru...se puede adaptar esta funcion Split para mySQL ?

Gracias! la necesito mucho

Michael Núñez dijo...

Saludos Roberto,

De seguro que si se puede, enviame tu correo para enviartela para MySql a elymichael@gmail.com

valeria dijo...

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 dijo...

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 dijo...

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 dijo...

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 dijo...

hola sera que esta funcion se puede adaptar para Firebird???
Gracias

Michael Núñez dijo...

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 dijo...

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 dijo...

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 dijo...

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

Ricardo dijo...

Muchas Gracias por el codigo, le hice algunas modificaciones para mi fin.

Arcangel Asesino dijo...

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 dijo...

Buenas,

La versión de MySQL que tenía para estas pruebas era la 5.0

Macbeth dijo...

Gracias, me ayudó bastante
:)

Macbeth dijo...

Gracias, me ayudó la función :)