Dove inserire la Funzione

giovedì 09 dicembre 2010 - 12.18
Tag Elenco Tags  SQL Server 2008 R2

mcfede88 Profilo | Newbie

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

lbenaglia Profilo | Guru

>Ho trovato questa funzione solo che mi hanno detto di metterla
>in query Analyzer ma su Sql 2008 non c'è, come devo fare?
Lancia SQL Server Management Studio, autenticati all'istanza, premi il bottone New Query, seleziona il db che dovrà contenere la funzione, copia ed incolla il codice della funzione e premi F5 (o il bottone Execute) per eseguire il comando di CREATE FUNCTION.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5