Kolejne pytanie: jak wykonać REPLACE w SQL Serverze, ale tak żeby zamieniało będąc wrażliwym na wielkość znaków? Czyli coś w stylu:
REPLACE(kolumna, ‚mars’, ‚Snickers’) – źle
REPLACE(kolumna, ‚Mars’, ‚Snickers’) – dobrze
Funkcja REPLACE dokonuje porównania stringów na podstawie parametru COLLATION bazy danych lub kolumny. Aby zmienić to zachowanie najprościej lokalnie wykorzystać COLLATE.
Na początek jak sprawdzić ustawienie COLLATION dla bazy danych:
SELECT SERVERPROPERTY (‚Collation’)
lub
exec sp_helpsort
u mnie dało odpowiednio:
Polish_CI_AS
lub
Polish, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive
Oznacza to, że ustawiono sortowanie bez względu na wielkość znaków (CI), ale z wrażliwością na akcenty (AS). Aby rozróżniać wielkość znaków ustawiamy COLLATE w zapytaniu:
CREATE TABLE #t ( k1 varchar(10) ) INSERT INTO #t VALUES ('Mars') INSERT INTO #t VALUES ('mars') INSERT INTO #t VALUES ('maRs') INSERT INTO #t VALUES ('MARS') SELECT * FROM #t WHERE k1 = 'mars' SELECT * FROM #t WHERE k1 COLLATE Polish_CS_AS = 'mars' DROP TABLE #t
Pierwszy SELECT zwróci wszystkie cztery wiersze, ponieważ weźmie pod uwagę globalne ustawienie sortowania. W drugim już wymuszamy branie pod uwagę wielkości znaków (CS = Case Sensitive), stąd tylko jeden wiersz.
Zastosowanie COLLATE w REPLACE:
SELECT REPLACE(k1, 'Mars', 'Snickers') FROM #t SELECT REPLACE(k1 COLLATE Polish_CS_AS, 'Mars', 'Snickers') FROM #t
Pierwszy przykład zamieni wszystkie wiersze, drugi tylko jeden.