Język serwera to domyślne ustawienie regionalne instancji SQL Server, stosowane gdy login nie ma własnej konfiguracji.
Język serwera w Microsoft SQL Server
Język serwera w Microsoft SQL Server jest ustawieniem regionalnym używanym jako wartość domyślna dla sesji, której login nie ma przypisanego własnego języka. Nie jest to język interfejsu systemu Windows ani ustawienie języka aplikacji korzystającej z bazy danych. SQL Server przechowuje listę obsługiwanych języków w widoku zgodnościowym sys.syslanguages. Każdy wpis określa między innymi nazwę języka, alias, nazwy miesięcy i dni tygodnia, pierwszy dzień tygodnia oraz domyślny format daty.
Ustawienie serwera ma znaczenie przede wszystkim wtedy, gdy połączenie nie przekazuje własnych parametrów regionalnych. W takiej sytuacji SQL Server może użyć języka określonego dla loginu, a jeżeli login nie ma takiej konfiguracji, zastosuje wartość domyślną instancji. Wpływa to na interpretację niektórych wartości daty i czasu, działanie funkcji zależnych od ustawień sesji oraz sposób prezentowania nazw miesięcy i dni tygodnia.
Dziedziczenie ustawień przez login i sesję
W SQL Server należy rozróżnić trzy poziomy konfiguracji: ustawienie domyślne instancji, język przypisany do loginu oraz ustawienia bieżącej sesji. Język loginu można sprawdzić w widoku sys.server_principals, korzystając z kolumny default_language_name. Dla loginów utworzonych bez jawnego wskazania języka zostaje wykorzystana wartość wynikająca z konfiguracji serwera obowiązującej w chwili tworzenia loginu. Zmiana domyślnego języka instancji nie musi więc automatycznie zmienić języka już istniejących loginów.
Po nawiązaniu połączenia sesja otrzymuje własny kontekst językowy. Można go sprawdzić poleceniem SELECT @@LANGUAGE;. Bieżący język sesji można zmienić poleceniem SET LANGUAGE Polish;, o ile nazwa języka jest rozpoznawana przez daną instancję. Zmiana wykonana przez SET LANGUAGE dotyczy konkretnego połączenia i nie zmienia konfiguracji loginu ani ustawienia całego serwera. Po zamknięciu sesji ustawienie to przestaje obowiązywać.
Wpływ języka na daty, dni tygodnia i komunikaty
Język sesji ustala między innymi wartość DATEFORMAT, czyli kolejność elementów daty w niektórych niejednoznacznych zapisach tekstowych. Ustawienie to można odczytać za pomocą DBCC USEROPTIONS;. Przykładowo zapis zawierający wyłącznie liczby, taki jak 03/04/2026, może zostać zinterpretowany różnie w zależności od kolejności miesiąca i dnia przyjętej przez sesję. Z tego powodu w kodzie SQL Server należy unikać niejednoznacznych literałów daty.
Bezpieczniejsze są formaty jednoznaczne dla silnika, takie jak zapis ISO używany odpowiednio do typu danych, albo parametry zapytania przekazywane przez sterownik. Na wynik funkcji DATEPART dla części związanych z tygodniem może wpływać także ustawienie DATEFIRST, określające pierwszy dzień tygodnia. Język może ustalać jego wartość początkową, ale późniejsza zmiana SET DATEFIRST działa już niezależnie na poziomie sesji. Ustawienia językowe mogą również wpływać na język komunikatów zwracanych przez SQL Server, jeżeli dla danego komunikatu dostępna jest odpowiednia lokalizacja.
Sprawdzanie i korekta konfiguracji SQL Server
Analizę problemu należy rozpocząć od ustalenia, jaki język ma instancja, jaki język przypisano używanemu loginowi i jaki język obowiązuje w konkretnej sesji. Pomocne są polecenia SELECT @@LANGUAGE;, DBCC USEROPTIONS; oraz zapytania do sys.server_principals i sys.syslanguages. Warto także sprawdzić, czy aplikacja korzysta stale z tego samego loginu i czy pulowanie połączeń nie powoduje używania sesji z wcześniejszymi ustawieniami.
Język loginu można określić podczas tworzenia loginu albo zmienić później poleceniem w rodzaju ALTER LOGIN [nazwa_loginu] WITH DEFAULT_LANGUAGE = [Polish];. Taka operacja wymaga odpowiednich uprawnień i powinna być wykonana po sprawdzeniu zależności aplikacji od formatów daty, nazw miesięcy oraz komunikatów błędów. Jeżeli problem dotyczy tylko jednego zapytania, właściwsza może być korekta zapytania, użycie parametrów lub jawne ustawienie wymaganych opcji sesji. W diagnostyce należy odróżnić błąd języka serwera od błędu konwersji typu, niepoprawnego formatu danych wejściowych i niewłaściwie skonfigurowanego sterownika.