Czasami polskie znaki (ą,ę,ć…) przysparzają sporo problemów, znalezienie np. loginu na podstawie nazwiska jest sporym wyzwaniem.
Stworzenie do tego celu wyszukiwania pełnotekstowego mija się z celem.
Możemy zrobić .NET (CLR) lub funkcję używającą REPLACE.
Ja proponuję sztuczkę z wykorzystaniem COALESCE
Tworzymy tabelkę
USE tempdb
go
CREATE TABLE #coalesce (txt VARCHAR (20))
go
INSERT #coalesce
SELECT 'jazn zolta ges cma'
UNION SELECT 'jaźń żółtą gęś ćma'
go
Sprawdzamy jakie mamy kodowanie
SELECT name,collation_name
FROM sys.all_columns
WHERE object_id = object_id('#coalesce')
name collation_name
----------------------------
txt Polish_CI_AS
Szukamy w tekście
SELECT txt FROM #coalesce
WHERE txt LIKE 'jazn zolta ges cma'
txt
--------------------
jazn zolta ges cma
(1 row(s) affected)
Możemy poszukać tak, ale to mało elastyczne rozwiązanie
SELECT txt FROM #coalesce
WHERE txt LIKE 'ja[zź][nń] [zż][oó][lł]t[aą] g[eę][sś] [cć]ma'
txt
--------------------
jazn zolta ges cma
jaźń żółtą gęś ćma
(2 row(s) affected)
Możemy zmienić kodowanie wyszukiwanego teksu
SELECT txt FROM #coalesce
WHERE txt LIKE 'jazn zolta ges cma' COLLATE cyrillic_general_ci_as
txt
--------------------
jazn zolta ges cma
jaźń żółtą gęś ćma
(2 row(s) affected)
Wybór strony kodowania na cyrillic_general_ci_as jedną z wielu możliwości.
CREATE TABLE #test(name varchar(200), description varchar(MAX))
go
INSERT #test
SELECT *
FROM fn_helpcollations()
CREATE TABLE #wynik (kodowanie varchar(200))
DECLARE @name varchar(200)
DECLARE @sql varchar(max)
SET @sql ='SELECT txt FROM #coalesce
WHERE txt LIKE ''jazn zolta ges cma'' COLLATE '
declare cursorek cursor for
SELECT name FROM #test
OPEN cursorek
FETCH NEXT FROM cursorek INTO
@name
WHILE @@fetch_status =0
BEGIN
EXEC (@sql+@name)
IF @@ROWCOUNT=2
INSERT #wynik SELECT @name
FETCH NEXT FROM cursorek INTO
@name
END
CLOSE cursorek
DEALLOCATE cursorek
SELECT COUNT(*) FROM #wynik
-----------
291
Brak komentarzy:
Prześlij komentarz