Ciao a tutti, dovrei utilizzare la funzione Levenshtein per correggere nomi di comuni non corretti.
Ho trovato questa funzione solo che mi hanno detto di metterla in query Analyzer ma su Sql 2008 non c'è, come devo fare?
--Query che estae il comune sbagliato e lo associa ai possibili comuni in base al CAP
SELECT OLD, LOCALITA
FROM
(
select UPPER(T_INDCOMCOD) AS OLD, [T_NAGINT], [T_CAP], LOCALITA, CAP from
ANAGRAFE_GENERALE.dbo.ANA_STOIND
LEFT JOIN dbo.TTLS MIG
ON T_CAP = CAP
WHERE T_INDCOMCOD NOT IN(SELECT LOCALITA FROM dbo.TTLS)
AND T_INDCOMCOD IS NOT NULL AND T_INDCOMCOD NOT LIKE ''
AND T_INDCOMCOD NOT LIKE '.' AND T_INDCOMCOD NOT LIKE '\'
AND T_CAP IS NOT NULL AND T_CAP NOT LIKE '' AND T_CAP = CAP
)AS T1
ORDER BY OLD
create function dbo.Levenshtein (@parola1 varchar(30), @parola2 varchar(30))
returns int
as
begin
declare @distanza int -- La variabile che viene restituita
declare @lenparola1 int -- La lunghezza della prima parola
declare @lenparola2 int -- la lunghezza della seconda parola
-- Calcolo la lunghezza delle due parole
set @lenparola1 = len(@parola1)
set @lenparola2 = len(@parola2)
-- Se la lunghezza di una delle due parole Ë 0 allora viene restituita la lunghezza dell'altra
if @lenparola1 = 0
set @distanza = @lenparola2
else if @lenparola2 = 0
set @distanza = @lenparola1
else
begin
declare @array_temp table (riga int,colonna int,valore int)
-- Creo una tabella temporanea per simulare un array bidimensionale
declare @i int
declare @j int
-- inizializzo la cella (0,0) con il valore 0
insert @array_temp values (0, 0, 0)
-- importo i valori della prima riga e della prima colonna a 0
set @i = 1
while @i <= @lenparola1
begin
insert @array_temp values (@i, 0, @i)
set @i = @i + 1
end
set @j = 1
while @j <= @lenparola2
begin
insert @array_temp values (0, @j, @j)
set @j = @j + 1
end
-- Ciclo sulle due parole calcolando la distanza
declare @cost int
declare @min1 int
declare @min2 int
declare @min3 int
set @i = 1
while @i <= @lenparola1
begin
set @j = 1
while @j <= @lenparola2
begin
-- Compare the letters and determine @cost
-- If they are the same, @cost is 0. If different,
-- @cost is 1
if (substring(@parola1, @i, 1) = substring(@parola2, @j, 1))
set @cost = 0
else
set @cost = 1
-- Calcolo il minimo tra:
-- La cella a sinistra
-- Quella in alto
-- E quella in alto a sinistra in diagonale
select @min1 = [valore] + 1
from @array_temp
where riga = @i - 1 and colonna = @j
select @min2 = [valore] + 1
from @array_temp
where riga = @i and colonna = @j - 1
select @min3 = [valore] + @cost
from @array_temp
where riga = @i - 1 and colonna = @j - 1
if @min2 < @min1
set @min1 = @min2
if @min3 < @min1
set @min1 = @min3
insert into @array_temp values (@i, @j, @min1)
set @j = @j + 1
end
set @i = @i + 1
end
-- La distanza finale Ë la cella in basso a destra
select @distanza = [valore]
from @array_temp
where riga = @lenparola1 and colonna = @lenparola2
end
-- Restituisco la distanza
return @distanza
end
create function dbo.Levenshtein (@parola1 varchar(30), @parola2 varchar(30))
returns int
as
begin
declare @distanza int -- La variabile che viene restituita
declare @lenparola1 int -- La lunghezza della prima parola
declare @lenparola2 int -- la lunghezza della seconda parola
-- Calcolo la lunghezza delle due parole
set @lenparola1 = len(@parola1)
set @lenparola2 = len(@parola2)
-- Se la lunghezza di una delle due parole Ë 0 allora viene restituita la lunghezza dell'altra
if @lenparola1 = 0
set @distanza = @lenparola2
else if @lenparola2 = 0
set @distanza = @lenparola1
else
begin
declare @array_temp table (riga int,colonna int,valore int)
-- Creo una tabella temporanea per simulare un array bidimensionale
declare @i int
declare @j int
-- inizializzo la cella (0,0) con il valore 0
insert @array_temp values (0, 0, 0)
-- importo i valori della prima riga e della prima colonna a 0
set @i = 1
while @i <= @lenparola1
begin
insert @array_temp values (@i, 0, @i)
set @i = @i + 1
end
set @j = 1
while @j <= @lenparola2
begin
insert @array_temp values (0, @j, @j)
set @j = @j + 1
end
-- Ciclo sulle due parole calcolando la distanza
declare @cost int
declare @min1 int
declare @min2 int
declare @min3 int
set @i = 1
while @i <= @lenparola1
begin
set @j = 1
while @j <= @lenparola2
begin
-- Compare the letters and determine @cost
-- If they are the same, @cost is 0. If different,
-- @cost is 1
if (substring(@parola1, @i, 1) = substring(@parola2, @j, 1))
set @cost = 0
else
set @cost = 1
-- Calcolo il minimo tra:
-- La cella a sinistra
-- Quella in alto
-- E quella in alto a sinistra in diagonale
select @min1 = [valore] + 1
from @array_temp
where riga = @i - 1 and colonna = @j
select @min2 = [valore] + 1
from @array_temp
where riga = @i and colonna = @j - 1
select @min3 = [valore] + @cost
from @array_temp
where riga = @i - 1 and colonna = @j - 1
if @min2 < @min1
set @min1 = @min2
if @min3 < @min1
set @min1 = @min3
insert into @array_temp values (@i, @j, @min1)
set @j = @j + 1
end
set @i = @i + 1
end
-- La distanza finale Ë la cella in basso a destra
select @distanza = [valore]
from @array_temp
where riga = @lenparola1 and colonna = @lenparola2
end
-- Restituisco la distanza
return @distanza
end