| Termin | Definicja |
|---|---|
| SET LANGUAGE | SET LANGUAGE zmienia język komunikatów i formatowania dat dla bieżącej sesji. Co dokładnie przestawia to polecenie w sesji SQL ServeraSET LANGUAGE działa na poziomie pojedynczego połączenia i zmienia trzy rzeczy naraz. Po pierwsze — język komunikatów systemowych, o ile w instancji zainstalowano zlokalizowany zestaw komunikatów (tabela sys.messages zawiera osobne wiersze dla każdego language_id). Po drugie — nazwy miesięcy i dni tygodnia zwracane przez DATENAME. Po trzecie, i to zaskakuje najczęściej, ustawia niejawnie DATEFORMAT oraz DATEFIRST. Po wykonaniu SET LANGUAGE Polish formatem domyślnym staje się dmy, a pierwszym dniem tygodnia poniedziałek (DATEFIRST 1), podczas gdy dla ustawienia us_english jest to mdy i niedziela (DATEFIRST 7). Listę dostępnych języków pokazuje procedura sp_helplanguage. Ustawienie domyślne kontra jawna zmiana w kodzieJeżeli nikt nie wywoła polecenia, sesja dziedziczy język przypisany do loginu, a ten z kolei domyślnie bierze wartość z konfiguracji instancji (opcja default language w sp_configure). Efekt bywa taki, że ta sama procedura zwraca inne wyniki użytkownikowi A i użytkownikowi B. Sytuację dodatkowo komplikuje pula połączeń w aplikacjach .NET: fizyczne połączenie jest przetrzymywane i odzyskiwane, więc ustawienie wykonane raz może przetrwać dłużej, niż programista zakłada, albo zniknąć w losowym momencie. Dlatego w kodzie produkcyjnym lepiej nie polegać na języku sesji, tylko wymuszać interpretację dat jawnie. Klasyczna pułapka z datami i sposób jej ominięciaZapis literału '03/04/2026' oznacza trzeciego kwietnia przy ustawieniu polskim i czwartego marca przy amerykańskim — i nie ma tu żadnego błędu do zgłoszenia, po prostu wynik jest inny. Bywa gorzej: '25/12/2026' przy mdy wyrzuci komunikat o konwersji poza zakres, więc awaria pojawia się dopiero pod koniec miesiąca. Bezpieczne są dwa zapisy: 'YYYYMMDD' bez separatorów, czytany identycznie niezależnie od ustawień, oraz pełny format ISO 8601 'YYYY-MM-DDTHH:MM:SS' dla typów datetime2 i datetimeoffset. Uwaga: sam zapis 'YYYY-MM-DD' z myślnikami przy typie datetime bywa interpretowany zgodnie z DATEFORMAT, co jest źródłem trudnych do wykrycia pomyłek w raportach. Diagnostyka baz programów handlowychRozjazdy językowe sesji dają o sobie znać w raportach sprzedaży i zestawieniach okresowych: tydzień liczony od niedzieli zamiast od poniedziałku przesuwa cały podział na tygodnie, a źle zinterpretowana data dokumentu potrafi wrzucić fakturę do sąsiedniego miesiąca. Wdrażamy i serwisujemy oprogramowanie handlowe oparte o SQL Server — Subiekt, WAPRO i Comarch — więc regularnie rozplątujemy takie przypadki: sprawdzamy język loginów, ustawienia instancji i sposób budowania zapytań w raportach niestandardowych. Obsługujemy zarówno firmy z serwerownią, jak i jednoosobowe działalności z bazą na jednym komputerze. |