| Termin | Definicja |
|---|---|
PRINT wypisuje komunikat w oknie wyników — przydatne przy debugowaniu skryptów T-SQL. PRINT w języku T-SQL — czym jest i do czego służyPRINT to prosta instrukcja języka T-SQL służąca do przekazywania tekstu albo wartości do okna komunikatów w narzędziu używanym do wykonywania zapytań. W praktyce pełni funkcję pomocniczą: pozwala poinformować o aktualnym etapie działania skryptu, pokazać zawartość zmiennej lub zaznaczyć, że określony fragment procedury został wykonany. Nie jest to instrukcja przeznaczona do prezentowania danych w tabeli wynikowej. Komunikat jest wyświetlany w osobnym obszarze, zwykle nazywanym zakładką komunikatów albo komunikatami zapytania. Najprostsza postać ma formę Instrukcja nie zmienia danych w bazie i sama w sobie nie zwraca zestawu rekordów. Jej zadaniem jest przekazanie krótkiej informacji osobie analizującej działanie skryptu. Z tego powodu szczególnie dobrze sprawdza się w procedurach składowanych, skryptach administracyjnych, zadaniach wykonywanych etapami oraz podczas ręcznej weryfikacji warunków logicznych. PRINT a komunikat, SELECT i RAISERROR — kontekst techniczny oraz porównaniaW środowisku T-SQL kilka instrukcji może służyć do przekazywania informacji, ale ich przeznaczenie nie jest takie samo. PRINT nadaje się do krótkich komunikatów diagnostycznych, które nie powinny być traktowane jako właściwy wynik zapytania. SELECT służy przede wszystkim do zwracania danych w postaci kolumn i wierszy. Jeśli celem jest sprawdzenie kilku rekordów, wyświetlenie wartości obliczonych dla wielu elementów albo przekazanie rezultatu do kolejnego narzędzia, właściwszy będzie SELECT. Przykładowo RAISERROR, a w nowszych wersjach także THROW, służy do sygnalizowania błędów lub sytuacji wymagających reakcji. Takie instrukcje mogą wpływać na obsługę wyjątków, poziom komunikatu i przebieg transakcji. PRINT nie zastępuje mechanizmu obsługi błędów. Użycie go przed lub po określonym fragmentem kodu może jednak pomóc ustalić, na którym etapie pojawił się problem. W rozbudowanym skrypcie przydatne bywa rozdzielenie tych ról: PRINT do śledzenia postępu, SELECT do prezentacji danych, a THROW lub RAISERROR do zgłaszania nieprawidłowego stanu. Istotna jest również kolejność pojawiania się komunikatów. W niektórych scenariuszach komunikat PRINT może zostać przekazany z opóźnieniem, ponieważ tekst jest buforowany. Przy krótkich skryptach zwykle nie ma to praktycznego znaczenia, ale przy długich operacjach wykonywanych etapami obserwowany komunikat może nie pojawić się natychmiast. W takich przypadkach warto rozważyć rozwiązania przeznaczone do natychmiastowego raportowania postępu, zależnie od wersji środowiska i sposobu uruchamiania kodu. Nie należy też traktować PRINT jako pełnego dziennika zdarzeń. Komunikaty tego rodzaju nie zapewniają wygodnego wyszukiwania, trwałego przechowywania, identyfikacji użytkownika ani rozbudowanej klasyfikacji zdarzeń. W procesach wymagających audytu lepiej stosować odpowiednio zaprojektowane tabele logów lub dedykowane mechanizmy rejestrowania. PRINT pozostaje lekkim narzędziem do bieżącej obserwacji działania kodu. PRINT w praktyce — typowe problemy i ograniczeniaJednym z częstszych problemów jest próba połączenia tekstu i wartości bezpośrednio za pomocą operatora plus, gdy wartości mają niezgodne typy. Fragment taki jak Drugim ograniczeniem jest długość komunikatu. PRINT nie jest przeznaczony do wypisywania bardzo dużych bloków tekstu. Dłuższy tekst może zostać skrócony, a sposób ograniczenia zależy między innymi od użytego typu danych i wersji środowiska. Przy prezentowaniu obszernych treści, zapytań, dokumentów XML lub dużych fragmentów JSON właściwsze będzie zwrócenie danych przez SELECT albo zapisanie ich w tabeli pomocniczej. Znaczenie ma także kodowanie znaków. Dla tekstu zawierającego znaki narodowe lub inne znaki spoza podstawowego zestawu znaków warto korzystać z typów Unicode i poprzedzać literał prefiksem W procedurach zawierających pętle nadmierna liczba komunikatów może utrudnić analizę. Wypisywanie tekstu przy każdej iteracji zwiększa ilość informacji i może spowolnić obserwowanie działania. Praktyczniej jest raportować tylko istotne punkty, na przykład rozpoczęcie etapu, zakończenie większej partii rekordów oraz wykrycie nietypowego warunku. Komunikat powinien zawierać kontekst, lecz nie powinien zastępować uporządkowanego wyniku. Warto pamiętać, że PRINT nie pokazuje automatycznie wartości wyrażeń tak jak niektóre funkcje debugujące w środowiskach programistycznych. Najpierw trzeba zbudować komunikat lub odwołać się do zmiennej. Przydatne jest zatem wcześniejsze przygotowanie wartości pośredniej, zwłaszcza gdy sprawdzany jest wynik kilku obliczeń. Pozwala to łatwiej odtworzyć przebieg działania i zmniejsza ryzyko błędu wynikającego z niejawnej konwersji. PRINT podczas testowania — praktyczne wskazówki dla skryptówNajlepszy efekt uzyskuje się wtedy, gdy komunikaty opisują kolejne etapy w sposób jednoznaczny. Zamiast wielu ogólnych wpisów typu Przy testowaniu warunków warto wypisywać zarówno nazwę sprawdzanej wartości, jak i jej zawartość. Należy jednak zachować ostrożność przy danych poufnych. Hasła, tokeny, pełne dane osobowe i inne informacje wrażliwe nie powinny trafiać do komunikatów diagnostycznych. W razie potrzeby można wypisać informację o samym fakcie ustawienia wartości, jej typie albo częściowo zamaskowanym identyfikatorze. Dobrym zwyczajem jest usuwanie tymczasowych komunikatów po zakończeniu testów lub zastępowanie ich komunikatami o trwałej wartości operacyjnej. Nadmiar pozostałości diagnostycznych utrudnia późniejsze czytanie skryptu. Jeśli komunikat ma pozostać, warto stosować spójną konwencję, na przykład prefiksy oznaczające etap, ostrzeżenie albo zakończenie. Nie powinno się jednak używać PRINT jako jedynego zabezpieczenia przed błędami. Przy analizie długiego działania można podzielić kod na wyraźne etapy i dodać komunikat przed oraz po każdym z nich. Jeśli drugi komunikat się nie pojawi, zawęża się obszar poszukiwania problemu. W przypadku procedur modyfikujących dane należy równocześnie kontrolować transakcje, warunki WHERE, liczbę zmienionych rekordów i ewentualne błędy. Sam fakt pojawienia się komunikatu nie oznacza, że operacja zakończyła się poprawnie. Jeżeli skrypt jest uruchamiany z poziomu aplikacji, narzędzia harmonogramującego albo innego klienta, sposób prezentacji PRINT może różnić się od tego znanego z edytora zapytań. Komunikaty mogą trafiać do logu klienta, zostać pominięte lub być dostępne w innym kanale niż wynik SELECT. Przed przyjęciem takiego rozwiązania jako mechanizmu monitorowania należy sprawdzić, gdzie faktycznie dociera treść i czy zostaje zachowana kolejność. PRINT i zgłoszenie problemu — kiedy potrzebne jest wsparcie techniczneDo serwisu warto zgłosić się wtedy, gdy problem z wykonywaniem skryptu nie wynika wyłącznie z samej składni PRINT, lecz towarzyszą mu zawieszanie programu, nieprawidłowe działanie systemu, błędy zapisu danych albo trudności z uruchomieniem narzędzia bazodanowego. Przed przekazaniem sprzętu lub środowiska do analizy warto zanotować treść komunikatu, moment jego wystąpienia, używane oprogramowanie oraz czynności wykonywane bezpośrednio wcześniej. Takie informacje ułatwiają odtworzenie sytuacji. W przypadku problemów ze sprzętem komputerowym pomoc może zapewnić Warszawskie Pogotowie Komputerowe 24/7, przy czym w ramach zgłoszenia dostępna jest darmowa diagnoza laptopa. Warto przekazać kopię skryptu pozbawioną haseł i danych wrażliwych oraz zaznaczyć, czy trudność dotyczy samego wyświetlania komunikatów, działania aplikacji, systemu operacyjnego czy nośnika danych. Precyzyjny opis pozwala oddzielić problem programistyczny od problemu z konfiguracją lub urządzeniem. Przed rozpoczęciem diagnostyki nie powinno się wielokrotnie uruchamiać operacji, która modyfikuje dane, jeśli nie ma pewności co do jej skutków. Bezpieczniej jest zachować kopię skryptu, zapisać otrzymane komunikaty i wstrzymać dalsze zmiany do czasu ustalenia przyczyny. PRINT może wskazać etap, na którym działanie przestało przebiegać prawidłowo, lecz pełna ocena wymaga uwzględnienia całego środowiska, konfiguracji oraz historii wykonanych czynności. |