Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa

Darmowa diagnoza laptopa

Dojazd do klienta bezpłatnie

Dojazd do klienta bezpłatnie

Laptopy zastępcze bezpłatnie

Laptopy zastępcze bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

DECLARE

Termin Definicja
DECLARE

DECLARE to instrukcja Transact-SQL służąca do zadeklarowania zmiennej lokalnej w skrypcie lub procedurze.

DECLARE w języku Transact-SQL

DECLARE to instrukcja języka Transact-SQL używana w Microsoft SQL Server do tworzenia zmiennych lokalnych, kursorów oraz zmiennych tabelarycznych. Zmienna lokalna przechowuje wartość określonego typu danych i może być wykorzystywana później w instrukcjach skryptu, procedury składowanej, funkcji lub wyzwalacza. Typowa deklaracja ma postać DECLARE @nazwa typ_danych;, na przykład DECLARE @Liczba INT;. Znak @ jest obowiązkową częścią nazwy zmiennej lokalnej.

Instrukcja może deklarować jedną zmienną albo kilka zmiennych w tym samym poleceniu, rozdzielając deklaracje przecinkami, na przykład DECLARE @Imie NVARCHAR(50), @Wiek INT;. Zmienną można od razu zainicjować wartością: DECLARE @Limit INT = 100;. Taki zapis jest obsługiwany we współczesnych wersjach SQL Server, natomiast w starszych skryptach często spotyka się osobne instrukcje DECLARE i SET albo przypisanie wartości przez SELECT.

Typ danych, wartość początkowa i NULL

Podczas deklarowania zmiennej trzeba wskazać jej typ danych. Może to być między innymi INT, BIGINT, DECIMAL, DATE, DATETIME2, BIT, VARCHAR lub NVARCHAR. Dla typów znakowych należy określić długość, na przykład NVARCHAR(200). Dobór typu wpływa na zakres przechowywanych wartości, sposób konwersji oraz działanie operatorów. Zmienna typu INT przechowuje liczby całkowite z zakresu od -2 147 483 648 do 2 147 483 647, natomiast BIGINT przeznaczony jest dla większych liczb całkowitych.

Jeżeli w deklaracji nie podano wartości początkowej, zmienna lokalna ma wartość NULL. Nie jest to zero, pusty tekst ani wartość logiczna FALSE, lecz oznaczenie braku znanej wartości. Ma to znaczenie przy obliczeniach i porównaniach. Na przykład wyrażenie @Cena > 100 zwróci wynik nieokreślony, jeśli @Cena ma wartość NULL. Do sprawdzania takiego stanu służy predykat IS NULL, a do zastępowania wartości pustej można użyć między innymi funkcji COALESCE.

Wartość zmiennej można zmienić instrukcją SET, na przykład SET @Liczba = 25;. Możliwe jest również użycie instrukcji SELECT, na przykład SELECT @Liczba = COUNT(*) FROM dbo.Produkty;. Przy przypisywaniu wyniku zapytania przez SELECT trzeba uwzględnić zachowanie SQL Server dla wielu wierszy. W takim przypadku zmienna może otrzymać wartość z ostatniego przetworzonego wiersza, dlatego do wartości pojedynczej najlepiej używać zapytania gwarantującego jednoznaczny rezultat.

Zakres obowiązywania zmiennej w skrypcie SQL Server

Zmienna zadeklarowana przez DECLARE jest lokalna dla partii poleceń, procedury składowanej, funkcji lub wyzwalacza, w której została utworzona. Nie można odwołać się do niej z całkowicie odrębnej partii wykonywanej później. Szczególne znaczenie ma polecenie GO: nie jest ono instrukcją Transact-SQL, lecz separatorem partii rozpoznawanym przez narzędzia takie jak SQL Server Management Studio oraz sqlcmd. Po GO zmienna zadeklarowana wcześniej nie jest już dostępna.

Przykładowo poniższy fragment działa w jednej partii: DECLARE @Id INT = 10; SELECT * FROM dbo.Urzadzenia WHERE Id = @Id;. Jeżeli między deklaracją a zapytaniem pojawi się GO, drugie polecenie zakończy się błędem, ponieważ SQL Server nie zna już zmiennej @Id. Zmienna zachowuje zakres także wewnątrz bloków sterujących, takich jak IF i WHILE, o ile została zadeklarowana w obowiązującym zakresie. Deklarowanie jej wyłącznie w jednym bloku może jednak ograniczyć możliwość użycia poza tym blokiem.

DECLARE może również tworzyć zmienną tabelaryczną, na przykład DECLARE @Wyniki TABLE (Id INT, Nazwa NVARCHAR(100));. Taki obiekt ma lokalny zakres i pozwala przechować zestaw wierszy na czas działania partii lub procedury. Zmienna tabelaryczna nie jest tym samym co trwała tabela utworzona poleceniem CREATE TABLE. W praktyce należy dobrać rozwiązanie do rozmiaru danych i charakteru operacji, ponieważ zmienne tabelaryczne oraz tabele tymczasowe mają inne właściwości optymalizacyjne i dotyczące statystyk.

DECLARE w procedurach, zapytaniach i diagnostyce

W procedurach składowanych DECLARE służy do przygotowania parametrów roboczych, liczników, dat granicznych oraz wartości pomocniczych. Przykładowy fragment może wyglądać tak: DECLARE @Od DATETIME2 = DATEADD(day, -7, SYSDATETIME());, a następnie używać zmiennej w filtrze zapytania. Instrukcja nie pobiera sama danych z tabeli i nie wykonuje operacji na dysku; jedynie tworzy obiekt lokalny, który inne instrukcje mogą później odczytać lub zmienić.

Podczas diagnostyki skryptu SQL warto sprawdzić, czy zmienna ma właściwy typ, czy nie pozostaje równa NULL oraz czy przypisanie następuje przed jej użyciem. Trzeba też zwrócić uwagę na niejawne konwersje, zwłaszcza gdy zmienna liczbowa jest porównywana z kolumną tekstową albo gdy do zmiennej znakowej trafia wartość o większej długości. Błędny typ lub zbyt krótka długość może spowodować obcięcie danych, błąd konwersji albo nieoczekiwany plan wykonania zapytania.

W skryptach uruchamianych przez narzędzia administracyjne i aplikacje należy odróżnić zmienne lokalne deklarowane przez DECLARE od parametrów sesji lub zmiennych środowiskowych używanych poza SQL Server. DECLARE nie tworzy ustawienia dostępnego dla innych połączeń z bazą. Każde połączenie ma własny kontekst wykonywania, a lokalna zmienna istnieje tylko w zakresie, w którym została zadeklarowana. To rozróżnienie pomaga prawidłowo analizować procedury, zapytania raportowe i błędy wynikające z utraty wartości między kolejnymi partiami poleceń.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę