— =======================================================================
— Author : Manuel Daponte
— Author : Manuel Daponte
— Created: 2009-10-28
— Descrip:
—
— Copia barata de la funcion translate de Oracle
— Al string @expr le busca si contiene alguno de los caracteres
— del @from y los reemplaza por el caracter en la misma del @to
—
— Ejemplo:
— translate(‘Mañana será mía’, ‘áéíóúñ’, ‘aeiou~’)
— Retornara:
— Ma~ana sera mia
— =======================================================================
— Descrip:
—
— Copia barata de la funcion translate de Oracle
— Al string @expr le busca si contiene alguno de los caracteres
— del @from y los reemplaza por el caracter en la misma del @to
—
— Ejemplo:
— translate(‘Mañana será mía’, ‘áéíóúñ’, ‘aeiou~’)
— Retornara:
— Ma~ana sera mia
— =======================================================================
use Exencion
go
go
create function translate (
@expr varchar(max),
@from varchar(50),
@to varchar(50)
)
returns varchar(max)
as
begin
declare @len_expr smallint — largo de la expresion donde se haran los reemplazos
declare @len_from smallint — largo del string con los caracteres a reemplazar
declare @len_to smallint — largo del string con los caracteres de reemplazo
@expr varchar(max),
@from varchar(50),
@to varchar(50)
)
returns varchar(max)
as
begin
declare @len_expr smallint — largo de la expresion donde se haran los reemplazos
declare @len_from smallint — largo del string con los caracteres a reemplazar
declare @len_to smallint — largo del string con los caracteres de reemplazo
— averiguamos los largos de los strings
select @len_expr = len(@expr), @len_from = len(@from), @len_to = len(@to)
select @len_expr = len(@expr), @len_from = len(@from), @len_to = len(@to)
— no tenemos nada que cambiar
if @len_expr = 0 or @len_from = 0
return @expr
if @len_expr = 0 or @len_from = 0
return @expr
declare @char_from char(1) — para guardar cada caracter que queremos reemplazar
declare @pos_from smallint — en que posicion del @from esta el caracter que estamos procesando
set @pos_from = 1
declare @pos_from smallint — en que posicion del @from esta el caracter que estamos procesando
set @pos_from = 1
— recorremos el @from
while (@pos_from <= @len_from)
begin
— cual es el equivalente en @to de este caracter
if @pos_from <= @len_to
begin
— el caracter tiene un reemplazo
set @expr = replace(@expr, substring(@from, @pos_from, 1), substring(@to, @pos_from, 1))
end
else
begin
— el caracter no tiene un reemplazo
set @expr = replace(@expr, substring(@from, @pos_from, 1), ”)
end
— pasamos al siguiente caracter del @from
set @pos_from = @pos_from + 1
end
return @expr
set @pos_from = @pos_from + 1
end
return @expr
end
…Y esta es la manera de ejecutarla:
select dbo.translate(‘Mañana será mía, Ñoño!’, ‘áéíóúñ’, ‘aeiou~’)
Ma~ana sera mia, ~o~o!
select dbo.translate(‘Mañana será mía, Ñoño!’, ‘áéíóúñ’, ‘a’)
Maana sera ma, oo!