Interpretacja składni T-SQL przez SQL Server ściśle zależy od systemu powiązań bazy danych (database collation), a czasem - całego serwera (server collation). W dokumentacji nie jest to mocno artykułowane i często kwestia ta bywa niesłusznie pomijana. Poniższy przykład zobrazuje potencjalny problem. Stwórzmy testową bazę danych:
CREATE DATABASE collation_test;
Następnie ustawmy collation na
Polish_CI_AS, czyli system powiązań, który nie uwzględnia wielkości liter:
ALTER DATABASE collation_test COLLATE Polish_CI_AS;
Stwórzmy tabelę o nazwie
tEstoWa:
CREATE TABLE tEstoWa ( colA int );
Teraz odwołamy się do tabeli, deklarując jej nazwę wyłącznie małymi literami:
-- USE testowa;
SELECT colA FROM testowa;
Zapytanie wykonało się bez żadnego błędu. Zmieńmy następnie collation na
Polish_CS_AS (case sensitive):
ALTER DATABASE collation_test COLLATE Polish_CS_AS;
A następnie wykonajmy ponownie zapytanie. Uzyskamy taki oto błąd:
-- USE testowa;
-- SELECT colA FROM testowa;
Msg 208, Level 16, State 1, Line 1
Invalid object name 'testowa'.
SQL Server zwróci analogiczny błąd, jeśli określimy nazwę kolumny nie uwzględniając wielkości liter. Należy pamiętać, że reguły wielkości liter odnoszą się do nazw wszystkich obiektów w bazie danych - m.in. tabel, procedur, funkcji, także zmiennych i parametrów. Niezależne od collation są tylko słowa kluczowe języka T-SQL.
Kilka dni temu w pracy miałem sytuację, że mimo case insensitive collation bazy danych przeniesionej na nowy serwer, procedury, w których do składni podchodzono dość swobodnie (do zmiennej zadeklarowanej jako @zmienna odwoływano się jako @ZMIENNA), zaczęły rzucać błędami. Pomogła dopiero zmiana collation dla całego serwera na case insensitive. Niestety zmiana server collation jest bardzo kłopotliwa, gdyż odbywa się przez rekonfigurację serwera w trybie setup i wymaga przebudowy bazy master (wszystkie inne bazy są dropowane). Warto więc pomyśleć o opisywanych kwestiach już na etapie instalacji SQL Servera.