// Kod pobrany ze strony http://strefa.guzowski.info // Opis do kodu: // http://strefa.guzowski.info/archives/30,2006,12,13.html public class TSQL_vs_CLR { [SqlFunction(DataAccess = DataAccessKind.None)] public static int LD (string s, string t) { int n = s.Length; //length of s int m = t.Length; //length of t int[,] d = new int[n + 1, m + 1]; // matrix int cost; // cost // Step 1 if(n == 0) return m; if(m == 0) return n; // Step 2 for(int i = 0; i <= n; d[i, 0] = i++); for(int j = 0; j <= m; d[0, j] = j++); // Step 3 for(int i = 1; i <= n;i++) { //Step 4 for(int j = 1; j <= m;j++) { // Step 5 cost = (t.Substring(j - 1, 1) == s.Substring(i - 1, 1) ? 0 : 1); // Step 6 d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); } } // Step 7 return d[n, m]; } [SqlFunction(DataAccess = DataAccessKind.Read)] public static int FnCalculateLD_CLR(int wiersz1, int wiersz2) { string com = "SELECT nazwa_glowna, nazwa_skr, miejscowosc, adres, nr_lokalu, nip, kod_poczt FROM Dane_adresowe WHERE wiersz IN (" + wiersz1.ToString() + "," + wiersz2.ToString() + ")"; int c = 0; // pola string nazwa_glowna_A = ""; string nazwa_skr_A = ""; string miejscowosc_A = ""; string adres_A = ""; string nr_lokalu_A = ""; string nip_A = ""; string kod_poczt_A = ""; string nazwa_glowna_B = ""; string nazwa_skr_B = ""; string miejscowosc_B = ""; string adres_B = ""; string nr_lokalu_B = ""; string nip_B = ""; string kod_poczt_B = ""; using (SqlConnection conn = new SqlConnection("context connection=true")) { // pobranie danych (wykorzystanie context connection) conn.Open(); SqlCommand cmd = new SqlCommand(com, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { if (c == 0) { nazwa_glowna_A = dr["nazwa_glowna"].ToString(); nazwa_skr_A = dr["nazwa_skr"].ToString(); miejscowosc_A = dr["miejscowosc"].ToString(); adres_A = dr["adres"].ToString(); nr_lokalu_A = dr["nr_lokalu"].ToString(); nip_A = dr["nip"].ToString(); kod_poczt_A = dr["kod_poczt"].ToString(); c++; } if (c == 1) { nazwa_glowna_B = dr["nazwa_glowna"].ToString(); nazwa_skr_B = dr["nazwa_skr"].ToString(); miejscowosc_B = dr["miejscowosc"].ToString(); adres_B = dr["adres"].ToString(); nr_lokalu_B = dr["nr_lokalu"].ToString(); nip_B = dr["nip"].ToString(); kod_poczt_B = dr["kod_poczt"].ToString(); } } conn.Close(); // obliczenie wyniku return (LD(nazwa_glowna_A, nazwa_glowna_B) + LD(nazwa_skr_A, nazwa_skr_B) + LD(miejscowosc_A, miejscowosc_B) + LD(adres_A, adres_B) + LD(nr_lokalu_A, nr_lokalu_B) + LD(nip_A, nip_B) + LD(kod_poczt_A, kod_poczt_B)); } } }