Zmienne SQL: Deklarowanie, ustawianie i wybieranie zmiennych w programie SQL Server

โšก Inteligentne podsumowanie

Zmienne SQL Server to nazwane obiekty, ktรณre dziaล‚ajฤ… jako symbole zastฤ™pcze dla pojedynczej wartoล›ci danych w pamiฤ™ci. Zmienna musi zostaฤ‡ zadeklarowana za pomocฤ… instrukcji DECLARE, zanim bฤ™dzie moลผna przypisaฤ‡ jej wartoล›ฤ‡ i ponownie jej uลผyฤ‡.

  • ๐Ÿ“ฆ Definicja: Zmienna SQL Server przechowuje jednฤ… wartoล›ฤ‡ i peล‚ni funkcjฤ™ symbolu zastฤ™pczego dla okreล›lonej lokalizacji w pamiฤ™ci.
  • ๐Ÿ”ต Lokalnie i globalnie: W programie SQL Server obsล‚ugiwane sฤ… zmienne lokalne z prefiksem @, deklarowane przez uลผytkownikรณw, a takลผe zmienne globalne utrzymywane przez system z prefiksem @@.
  • ๐Ÿ“ OGลOSIฤ†: Polecenie DECLARE tworzy zmiennฤ… i domyล›lnie inicjuje jฤ… wartoล›ciฤ… NULL.
  • ๐Ÿ”€ Trzy metody przydzielania zadaล„: Wartoล›ฤ‡ moลผna przypisaฤ‡ podczas DECLARE, za pomocฤ… SET lub SELECT.
  • ๐Ÿ”Ž Podzapytania skalarne: Zarรณwno SET, jak i SELECT mogฤ… odczytaฤ‡ pojedynczฤ… wartoล›ฤ‡ z zapytania do zmiennej.
  • ???? SET kontra SELECT: Polecenie SET przypisuje jednฤ… zmiennฤ… i postฤ™puje zgodnie ze standardem ANSI, natomiast polecenie SELECT moลผe przypisaฤ‡ kilka zmiennych naraz.

Zmienne SQL Server: DECLARE, SET i SELECT

Co to jest zmienna w SQL Server?

In MS SQL ServerZmienne to obiekty, ktรณre dziaล‚ajฤ… jak symbole zastฤ™pcze dla okreล›lonej lokalizacji w pamiฤ™ci. Zmienna przechowuje pojedynczฤ… wartoล›ฤ‡ danych, ktรณrฤ… moลผna odczytaฤ‡ i ponownie wykorzystaฤ‡ w partii lub procedurze.

Typy zmiennych w SQL: lokalne, globalne

W programie MS SQL Server wystฤ™pujฤ… dwa typy zmiennych:

  • Zmienna lokalna
  • Zmienna globalna

Uลผytkownik moลผe jednak utworzyฤ‡ tylko zmiennฤ… lokalnฤ…. Poniลผszy rysunek wyjaล›nia dwa typy zmiennych dostฤ™pne w MS SQL Server.

Diagram dwรณch typรณw zmiennych w programie SQL Server: zmiennych lokalnych i zmiennych globalnych

Zmienna lokalna

  • Uลผytkownik deklaruje zmiennฤ… lokalnฤ….
  • Domyล›lnie nazwa zmiennej lokalnej zaczyna siฤ™ od @.
  • Zakres kaลผdej zmiennej lokalnej jest ograniczony do bieลผฤ…cego pakietu lub procedury w ramach danej sesji.

Zmienna globalna

  • System utrzymuje zmiennฤ… globalnฤ…. Uลผytkownik nie moลผe jej zadeklarowaฤ‡.
  • Nazwa zmiennej globalnej zaczyna siฤ™ od @@.
  • Przechowuje informacje zwiฤ…zane z sesjฤ….

Jak zadeklarowaฤ‡ zmiennฤ… w SQL

Przed uลผyciem jakiejkolwiek zmiennej w partii lub procedurze SQL, musisz jฤ… zadeklarowaฤ‡. Polecenie DECLARE tworzy zmiennฤ…, ktรณra dziaล‚a jako symbol zastฤ™pczy dla danej lokalizacji w pamiฤ™ci. Dopiero po deklaracji zmienna moลผe zostaฤ‡ uลผyta w dalszej czฤ™ล›ci zadania wsadowego lub procedury.

Skล‚adnia TSQL:

DECLARE  { @LOCAL_VARIABLE[AS] data_type  [ = value ] }

zasady:

  • Inicjalizacja jest opcjonalna podczas deklaracji.
  • Domyล›lnie DECLARE inicjuje zmiennฤ… wartoล›ciฤ… NULL.
  • Uลผycie sล‚owa kluczowego โ€žASโ€ jest opcjonalne.
  • Aby zadeklarowaฤ‡ wiฤ™cej niลผ jednฤ… zmiennฤ… lokalnฤ…, naleลผy dodaฤ‡ przecinek po pierwszej definicji, a nastฤ™pnie podaฤ‡ nazwฤ™ kolejnej zmiennej i typ danych.

Przykล‚ady deklarowania zmiennej

Zapytanie: z โ€žASโ€

DECLARE @COURSE_ID AS INT;

Zapytanie: bez โ€žASโ€

DECLARE @COURSE_NAME VARCHAR (10);

Zapytanie: Zdeklaruj dwie zmienne

DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);

Przypisanie wartoล›ci do zmiennej SQL

Istniejฤ… trzy sposoby przypisywania wartoล›ci zmiennej:

  • Podczas deklaracji zmiennej za pomocฤ… sล‚owa kluczowego DECLARE.
  • Uลผycie SET.
  • Uลผycie SELECT.

Przyjrzyjmy siฤ™ bliลผej wszystkim trzem sposobom.

Podczas deklaracji zmiennej przy uลผyciu sล‚owa kluczowego DECLARE

Skล‚adnia T-SQL:

DECLARE { @Local_Variable [AS] Datatype [ = value ] }

Tutaj po typie danych naleลผy uลผyฤ‡ znaku โ€ž=โ€, a po nim wartoล›ci, ktรณra ma zostaฤ‡ przypisana.

zapytanie:

DECLARE @COURSE_ID AS INT = 5
PRINT @COURSE_ID

Uruchomienie zapytania powoduje wydrukowanie wartoล›ci przypisanej podczas deklaracji, jak pokazano poniลผej.

Wyjล›cie zmiennej przypisanej podczas DECLARE, drukowanie wartoล›ci 5

Korzystanie ze zmiennej SQL SET

Czasami chcesz oddzieliฤ‡ deklaracjฤ™ od inicjalizacji. SET przypisuje wartoล›ฤ‡ zmiennej po jej zadeklarowaniu. Poniลผej przedstawiono rรณลผne sposoby przypisywania wartoล›ci za pomocฤ… SET.

Przykล‚ad: Przypisywanie wartoล›ci zmiennej za pomocฤ… polecenia SET

Skล‚adnia:

DECLARE @Local_Variable <Data_Type>
SET @Local_Variable =  <Value>

zapytanie:

DECLARE @COURSE_ID AS INT
SET @COURSE_ID = 5
PRINT @COURSE_ID

Wykonanie skryptu zwraca wartoล›ฤ‡ przypisanฤ… za pomocฤ… SET, jak pokazano poniลผej.

Wyjล›cie przypisywania wartoล›ci zmiennej za pomocฤ… SET, wydruk 5

Przykล‚ad: Przypisywanie wartoล›ci wielu zmiennym za pomocฤ… polecenia SET

Skล‚adnia:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable_2 <Data_Type>,
SET @Local_Variable_1 = <Value_1>
SET @Local_Variable_2 = <Value_2>

Reguล‚a: Jedno sล‚owo kluczowe SET moลผe przypisaฤ‡ wartoล›ฤ‡ tylko jednej zmiennej.

zapytanie:

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SET @COURSE_ID = 5
SET @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Oba polecenia PRINT zwracajฤ… obie przypisane wartoล›ci, jak pokazano poniลผej.

Wynik przypisania dwรณch zmiennych za pomocฤ… polecenia SET, wydruk 5 i UNIX

Przykล‚ad: Przypisywanie wartoล›ci zmiennej za pomocฤ… podzapytania skalarnego przy uลผyciu polecenia SET

Skล‚adnia:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable_2 <Data_Type>,SET @Local_Variable_1 = (SELECT <Column_1> from <Table_Name> where <Condition_1>)

zasady:

  • Umieล›ฤ‡ zapytanie w nawiasach.
  • Zapytanie powinno byฤ‡ zapytaniem skalarnym, co oznacza, ลผe โ€‹โ€‹zwraca tylko jeden wiersz i jednฤ… kolumnฤ™. W przeciwnym razie zapytanie zgล‚osi bล‚ฤ…d.
  • Jeลผeli zapytanie zwrรณci zero wierszy, wรณwczas zmienna zostanie ustawiona na EMPTY, czyli NULL.

Zaล‚รณลผmy, ลผe mamy stรณล‚ o imieniu 'Guru99' z dwiema kolumnami, jak pokazano poniลผej. Ta tabela jest uลผywana w poniลผszych przykล‚adach.

Guru99 tabela z kolumnami Tutorial_ID i Tutorial_name uลผywanymi w przykล‚adach

Przykล‚ad 1: Gdy podzapytanie zwraca jeden wiersz jako wynik

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3)
PRINT @COURSE_NAME

Poniewaลผ podzapytanie zwraca jeden pasujฤ…cy wiersz, zmienna otrzymuje tฤ™ wartoล›ฤ‡, jak pokazano poniลผej.

Wyjล›cie skalarnego podzapytania przypisanego za pomocฤ… SET, wyล›wietlajฤ…ce dopasowanฤ… nazwฤ™ samouczka

Przykล‚ad 2: Kiedy podzapytanie w wyniku zwraca zero wierszy

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

Poniewaลผ podzapytanie nie zwraca ลผadnych wierszy, wartoล›ฤ‡ zmiennej jest PUSTA, czyli NULL, wiฤ™c nic nie zostaje wydrukowane, jak pokazano poniลผej.

Wynik podzapytania skalarnego SET, ktรณre nie zwraca ลผadnych wierszy, pozostawiajฤ…c zmiennฤ… NULL

Korzystanie ze zmiennej SELECT jฤ™zyka SQL

Podobnie jak w przypadku polecenia SET, polecenie SELECT umoลผliwia rรณwnieลผ przypisanie wartoล›ci zmiennym po ich zadeklarowaniu poleceniem DECLARE. Poniลผej przedstawiono rรณลผne sposoby przypisywania wartoล›ci za pomocฤ… polecenia SELECT.

Przykล‚ad: Przypisywanie wartoล›ci zmiennej za pomocฤ… polecenia SELECT

Skล‚adnia:

DECLARE @LOCAL_VARIABLE <Data_Type>
SELECT @LOCAL_VARIABLE = <Value>

zapytanie:

DECLARE @COURSE_ID INT
SELECT @COURSE_ID = 5
PRINT @COURSE_ID

Zadanie SELECT drukuje wartoล›ฤ‡, jak pokazano poniลผej.

Wynik przypisania wartoล›ci do zmiennej za pomocฤ… polecenia SELECT, wydruk 5

Przykล‚ad: Przypisywanie wartoล›ci wielu zmiennym za pomocฤ… polecenia SELECT

Skล‚adnia:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Value_1>,  @Local_Variable _2 = <Value_2>

Reguล‚a: W przeciwieล„stwie do polecenia SET polecenie SELECT pozwala przypisaฤ‡ wartoล›ฤ‡ wielu zmiennym, rozdzielajฤ…c je przecinkami.

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Obie zmienne sฤ… przypisywane za pomocฤ… jednego polecenia SELECT, jak pokazano poniลผej.

Wynik przypisania dwรณch zmiennych za pomocฤ… jednego polecenia SELECT, wydrukowanie 5 i UNIX

Przykล‚ad: Przypisywanie wartoล›ci zmiennej za pomocฤ… podzapytania przy uลผyciu polecenia SELECT

Skล‚adnia:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = (SELECT <Column_1> from <Table_name> where <Condition_1>)

zasady:

  • Umieล›ฤ‡ zapytanie w nawiasach.
  • Zapytanie powinno byฤ‡ skalarne i zwracaฤ‡ jeden wiersz i jednฤ… kolumnฤ™. W przeciwnym razie zapytanie zgล‚osi bล‚ฤ…d.
  • Jeลผeli zapytanie zwrรณci zero wierszy, wรณwczas zmienna jest PUSTA, czyli ma wartoล›ฤ‡ NULL.

Rozwaลผmy nasze 'GuruStรณล‚ 99'.

Przykล‚ad 1: Gdy podzapytanie zwraca jeden wiersz jako wynik

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1)
PRINT @COURSE_NAME

Podzapytanie zwraca jeden wiersz, wiฤ™c zmienna przechowuje tฤ™ wartoล›ฤ‡, jak pokazano poniลผej.

Wyjล›cie skalarnego podzapytania przypisanego za pomocฤ… SELECT, wyล›wietlajฤ…ce pasujฤ…cฤ… nazwฤ™ samouczka

Przykล‚ad 2: Kiedy podzapytanie w wyniku zwraca zero wierszy

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

W przypadku braku pasujฤ…cego wiersza zmienna pozostaje PUSTA, czyli NULL, jak pokazano poniลผej.

Wynik skalarnego podzapytania SELECT, ktรณre nie zwraca ลผadnych wierszy, pozostawiajฤ…c zmiennฤ… NULL

Przykล‚ad 3: Przypisanie wartoล›ci zmiennej za pomocฤ… standardowego polecenia SELECT

Skล‚adnia:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Column_1> from <Table_name> where <Condition_1>

zasady:

  • W przeciwieล„stwie do SET, jeล›li zapytanie zwraca wiele wierszy, wรณwczas wartoล›ฤ‡ zmiennej jest ustawiana na wartoล›ฤ‡ ostatniego wiersza.
  • Jeลผeli zapytanie zwrรณci zero wierszy, wรณwczas zmienna zostanie ustawiona na EMPTY, czyli NULL.

Zapytanie 1: Zapytanie zwraca jeden wiersz

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3
PRINT @COURSE_NAME

Pojedynczy pasujฤ…cy wiersz ustawia wartoล›ฤ‡ zmiennej, jak pokazano poniลผej.

Wynik standardowego zadania SELECT zwracajฤ…cego jeden wiersz

Zapytanie 2: Zapytanie zwraca wiele wierszy

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99
PRINT @COURSE_NAME

Jeล›li kilka wierszy siฤ™ zgadza, zmienna zachowuje wartoล›ฤ‡ z ostatniego wiersza, jak pokazano poniลผej.

Wynik standardowego zadania SELECT zwracajฤ…cego wiele wierszy, keeping wartoล›ฤ‡ ostatniego wiersza

Zapytanie 3: Zapytanie zwraca zero wierszy

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5
PRINT @COURSE_NAME

Jeล›li nie ma pasujฤ…cych wierszy, zmienna jest PUSTA, czyli NULL, jak pokazano poniลผej.

Wynik standardowego zadania SELECT nie zwracajฤ…cego ลผadnych wierszy i pozostawiajฤ…cego zmiennฤ… NULL

Inne przykล‚ady zmiennych SQL

Zadeklarowanฤ… zmiennฤ… moลผna rรณwnieลผ wykorzystaฤ‡ wewnฤ…trz zapytania, na przykล‚ad w klauzuli WHERE w celu filtrowania wierszy.

zapytanie:

DECLARE @COURSE_ID Int = 1
SELECT * from Guru99 where Tutorial_id = @COURSE_ID

Zmienna filtruje zapytanie i zwraca pasujฤ…cy wiersz, jak pokazano poniลผej.

Wynik uลผycia zmiennej w klauzuli WHERE w celu filtrowania GuruTabela 99

Interesujฤ…ce fakty na temat zmiennych SQL Server!

  • Zmiennฤ… lokalnฤ… moลผna wyล›wietliฤ‡ zarรณwno za pomocฤ… polecenia PRINT, jak i SELECT.
  • Typ danych tabeli nie pozwala na uลผycie โ€žASโ€ podczas deklaracji.
  • SET jest zgodny ze standardami ANSI, natomiast SELECT nie.
  • Dozwolone jest rรณwnieลผ utworzenie zmiennej lokalnej o nazwie @. Na przykล‚ad, moลผna jฤ… zadeklarowaฤ‡ jako:
'DECLARE @@ as VARCHAR (10)'

FAQ

Po uruchomieniu polecenia DECLARE bez przypisania, zmienna SQL Server ma wartoล›ฤ‡ NULL. Zmienna istnieje, ale nie ma wartoล›ci, dopรณki nie przypisze siฤ™ jej za pomocฤ… polecenia DECLARE z operatorem =, SET lub SELECT. Odwoล‚anie siฤ™ do niej przed przypisaniem po prostu zwraca wartoล›ฤ‡ NULL.

Gdy podzapytanie nie zwrรณci ลผadnych wierszy, polecenie SET przypisze wartoล›ฤ‡ NULL i nadpisze wszelkie bieลผฤ…ce wartoล›ci. Polecenie SELECT zamiast tego pozostawi zmiennฤ… bez zmian, zachowujฤ…cping jakฤ…kolwiek wartoล›ฤ‡ juลผ posiadaล‚a. Ta rรณลผnica ma znaczenie, gdy zmienna na poczฤ…tku miaล‚a wartoล›ฤ‡ rรณลผnฤ… od NULL.

Zmienna tabelaryczna, zadeklarowana jako DECLARE @t TABLE(โ€ฆ), przechowuje maล‚y zbiรณr wynikรณw ograniczony do jednej partii. W przeciwieล„stwie do tabeli #temp, istnieje ona tylko w obrฤ™bie partii, nie moลผna jej zmieniฤ‡ po utworzeniu i czฤ™sto nadaje siฤ™ do maล‚ych zbiorรณw danych.

Zmienna lokalna jest ograniczona do partii, procedury skล‚adowanej lub wyzwalacza, w ktรณrym zostaล‚a zadeklarowana, w ramach jednej sesji. Sล‚owo kluczowe GO koล„czy partiฤ™, wiฤ™c do zmiennej zadeklarowanej przed GO nie moลผna siฤ™ odwoล‚ywaฤ‡ po nim.

Zmienna moลผe uลผywaฤ‡ niemal dowolnego serwera SQL Server typ danych, w tym int, decimal, varchar, nvarchar, date, datetime, bit i table. Dopasuj zmiennฤ… do kolumny, ktรณrฤ… reprezentuje, aby uniknฤ…ฤ‡ bล‚ฤ™dรณw konwersji niejawnej.

Przypisz zmiennฤ… do siebie za pomocฤ… SET, na przykล‚ad SET @counter = @counter + 1. SELECT rรณwnieลผ dziaล‚a: SELECT @total = @total + price. Ten wzorzec steruje pฤ™tlami i obliczeniami sum w skryptach i procedurach skล‚adowanych.

Tak. Drugi pilot GitHub Potrafi generowaฤ‡ polecenia DECLARE, SET i SELECT na podstawie komentarzy w jฤ™zyku naturalnym i sugerowaฤ‡ odpowiednie typy danych. Zawsze sprawdzaj wygenerowane nazwy, typy i logikฤ™ przypisania pod kฤ…tem schematu przed uruchomieniem go w ล›rodowisku produkcyjnym.

Asystenci sztucznej inteligencji i uczenia maszynowego tracJak zmienne odbierajฤ… i przekazujฤ… wartoล›ci, oznaczajฤ… niezainicjowane lub bล‚ฤ™dnie wpisane zmienne i sugerujฤ… przerรณbki oparte na zbiorach, ktรณre zastฤ™pujฤ… powolne pฤ™tle sterowane zmiennymi. Deweloper nadal potwierdza kaลผdฤ… zmianฤ™ na podstawie rzeczywistych danych i obciฤ…ลผenia.

Podsumuj ten post nastฤ™pujฤ…co: