SQL-variabler: SQL Server Deklarera, ange och välj variabel

⚡ Smart sammanfattning

SQL Server-variabler är namngivna objekt som fungerar som platshållare för ett enskilt datavärde i minnet. En variabel måste deklareras med DECLARE-satsen innan den kan tilldelas ett värde och återanvändas.

  • 📦 Definition: En SQL Server-variabel innehåller ett värde och fungerar som en platshållare för en minnesplats.
  • ???? Lokalt och globalt: SQL Server stöder lokala variabler med prefixet @ som användare deklarerar, och systemunderhållna globala variabler med prefixet @@.
  • 📝 FÖRKLARA: DECLARE-satsen skapar en variabel och initierar den som standard till NULL.
  • 🔀 Tre tilldelningsmetoder: Ett värde kan tilldelas under DECLARE, med SET eller med SELECT.
  • 🔎 Skalära delfrågor: Både SET och SELECT kan läsa ett enda värde från en fråga till en variabel.
  • 🧠 SET kontra SELECT: SET tilldelar en variabel och följer ANSI-standarden, medan SELECT kan tilldela flera samtidigt.

SQL Server-variabler: DECLARE, SET och SELECT

Vad är en variabel i SQL Server?

In MS SQL Server, variabler är objekt som fungerar som platshållare för en minnesplats. En variabel innehåller ett enda datavärde som du kan läsa och återanvända i en batch eller procedur.

Variabeltyper i SQL: Lokalt, Globalt

MS SQL Server har två typer av variabler:

  • Lokal variabel
  • Global variabel

En användare kan dock bara skapa en lokal variabel. Figuren nedan förklarar de två typerna av variabler som finns tillgängliga i MS SQL Server.

Diagram över de två variabeltyperna i SQL Server: lokala variabler och globala variabler

Lokal variabel

  • En användare deklarerar den lokala variabeln.
  • Som standard börjar ett lokalt variabelnamn med @.
  • Varje lokal variabel är begränsad till den aktuella batchen eller proceduren inom en given session.

Global variabel

  • Systemet underhåller den globala variabeln; en användare kan inte deklarera en.
  • Ett globalt variabelnamn börjar med @@.
  • Den lagrar sessionsrelaterad information.

Hur man DEKLÄRERAR en variabel i SQL

Innan du använder någon variabel i en batch eller procedur i SQL, måste du deklarera den. DECLARE-kommandot skapar en variabel som fungerar som en platshållare för en minnesplats. Först när deklarationen har gjorts kan variabeln användas i den efterföljande delen av batchen eller proceduren.

TSQL-syntax:

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

regler:

  • Initialisering är valfritt vid deklaration.
  • Som standard initierar DECLARE variabeln till NULL.
  • Att använda nyckelordet 'AS' är valfritt.
  • För att deklarera mer än en lokal variabel, lägg till ett kommatecken efter den första definitionen, ange sedan nästa variabelnamn och data typ.

Exempel på att deklarera en variabel

Fråga: Med 'AS'

DECLARE @COURSE_ID AS INT;

Fråga: Utan 'AS'

DECLARE @COURSE_NAME VARCHAR (10);

Fråga: DEKLARERA två variabler

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

Tilldela ett värde till SQL-variabel

Du kan tilldela ett värde till en variabel på följande tre sätt:

  • Under variabeldeklaration med hjälp av nyckelordet DECLARE.
  • Använder SET.
  • Använda VÄLJ.

Låt oss titta på alla tre sätten i detalj.

Under variabeldeklaration med nyckelord DECLARE

T-SQL-syntax:

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

Här, efter datatypen, kan du använda '=' följt av värdet som ska tilldelas.

Fråga:

DECLARE @COURSE_ID AS INT = 5
PRINT @COURSE_ID

Om frågan körs skrivs det värde som tilldelats under deklarationen ut, som visas nedan.

Utdata från en variabel som tilldelats under DECLARE, utskrift av värdet 5

Använda SQL SET-variabeln

Ibland vill man hålla deklaration och initialisering separata. SET tilldelar ett värde till variabeln efter att den har deklarerats. Nedan följer de olika sätten att tilldela värden med SET.

Exempel: Tilldela ett värde till en variabel med hjälp av SET

Syntax:

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

Fråga:

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

Att köra skriptet returnerar värdet som tilldelats med SET, vilket visas nedan.

Utdata för att tilldela ett värde till en variabel med SET, utskrift 5

Exempel: Tilldela ett värde till flera variabler med hjälp av SET

Syntax:

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

Regel: Ett SET-nyckelord kan endast tilldela ett värde till en variabel.

Fråga:

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

De två PRINT-satserna returnerar båda tilldelade värdena, som visas nedan.

Utdata för tilldelning av två variabler med SET, utskrift 5 och UNIX

Exempel: Tilldela ett värde till en variabel med en skalär delfråga med hjälp av SET

Syntax:

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

regler:

  • Omge frågan inom parentes.
  • Frågan ska vara en skalär fråga, vilket innebär att den bara returnerar en rad och en kolumn. Annars genererar frågan ett fel.
  • Om frågan returnerar noll rader sätts variabeln till EMPTY, det vill säga NULL.

Anta att vi har bord som heter 'Guru99' med två kolumner, som visas nedan. Denna tabell används i följande exempel.

Guru99 tabeller med kolumnerna Tutorial_ID och Tutorial_name som används i exemplen

Exempel 1: När delfrågan returnerar en rad som resultat

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

Eftersom delfrågan returnerar en matchande rad får variabeln det värdet, som visas nedan.

Utdata från en skalär delfråga tilldelad med SET, utskrift av det matchande handledningsnamnet

Exempel 2: När delfrågan returnerar noll rader som resultat

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

Eftersom delfrågan inte returnerar några rader är variabelvärdet EMPTY, det vill säga NULL, så ingenting skrivs ut, som visas nedan.

Utdata från en skalär SET-underfråga som returnerar inga rader, vilket lämnar variabeln NULL

Använda SQL SELECT-variabeln

Precis som med SET kan du även använda SELECT för att tilldela värden till variabler efter att ha deklarerat dem med DECLARE. Nedan följer olika sätt att tilldela ett värde med SELECT.

Exempel: Tilldela ett värde till en variabel med hjälp av SELECT

Syntax:

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

Fråga:

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

SELECT-tilldelningen skriver ut värdet, som visas nedan.

Utdata för att tilldela ett värde till en variabel med hjälp av SELECT, utskrift 5

Exempel: Tilldela ett värde till flera variabler med hjälp av SELECT

Syntax:

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

Regel: Till skillnad från SET kan SELECT tilldela ett värde till flera variabler separerade med kommatecken.

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

Båda variablerna tilldelas i en enda SELECT, som visas nedan.

Utdata för att tilldela två variabler med en enda SELECT, utskrift av 5 och UNIX

Exempel: Tilldela värdet till en variabel med en underfråga med hjälp av SELECT

Syntax:

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

regler:

  • Omge frågan inom parentes.
  • Frågan ska vara en skalär fråga som returnerar en rad och en kolumn. Annars genererar frågan ett fel.
  • Om frågan returnerar noll rader är variabeln EMPTY, det vill säga NULL.

Ompröva vår 'Guru99 fots bord.

Exempel 1: När delfrågan returnerar en rad som resultat

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

Delfrågan returnerar en rad, så variabeln innehåller det värdet, som visas nedan.

Utdata från en skalär delfråga tilldelad med SELECT, utskrift av det matchande handledningsnamnet

Exempel 2: När delfrågan returnerar noll rader som resultat

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

Utan någon matchande rad förblir variabeln TOM, det vill säga NULL, som visas nedan.

Utdata från en skalär SELECT-underfråga som returnerar inga rader, vilket lämnar variabeln NULL

Exempel 3: Tilldela ett värde till en variabel med ett vanligt SELECT-uttryck

Syntax:

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

regler:

  • Till skillnad från SET, om frågan returnerar flera rader, sätts variabelvärdet till värdet på den sista raden.
  • Om frågan returnerar noll rader sätts variabeln till EMPTY, det vill säga NULL.

Fråga 1: Frågan returnerar en rad

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

Den enda matchande raden anger variabelvärdet, som visas nedan.

Utdata från en vanlig SELECT-tilldelning som returnerar en rad

Fråga 2: Frågan returnerar flera rader

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

När flera rader matchar behåller variabeln värdet från den sista raden, som visas nedan.

Utdata från en vanlig SELECT-tilldelning som returnerar flera rader, keeping det sista radvärdet

Fråga 3: Frågan returnerar noll rader

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

När inga rader matchar är variabeln EMPTY, det vill säga NULL, som visas nedan.

Utdata från en vanlig SELECT-tilldelning returnerar inga rader, vilket lämnar variabeln NULL

Andra SQL-variable exempel

En deklarerad variabel kan också användas inuti en fråga, till exempel i en WHERE-klausul för att filtrera rader.

Fråga:

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

Variabeln filtrerar frågan och returnerar matchande rad, som visas nedan.

Utdata för att använda en variabel i en WHERE-klausul för att filtrera Guru99-tabellen

Intressanta fakta om SQL Server-variabler!

  • En lokal variabel kan visas med hjälp av både PRINT och SELECT-kommandot.
  • Tabelldatatypen tillåter inte användning av 'AS' under deklaration.
  • SET följer ANSI-standarder, medan SELECT inte gör det.
  • Det är också tillåtet att skapa en lokal variabel med namnet @. Den kan till exempel deklareras som:
'DECLARE @@ as VARCHAR (10)'

Vanliga frågor

Efter att DECLARE körts utan tilldelning, innehåller en SQL Server-variabel NULL. Variabeln finns men har inget värde förrän du tilldelar en med DECLARE med =, SET eller SELECT. Att referera till den före tilldelning returnerar helt enkelt NULL.

När delfrågan inte returnerar några rader, tilldelar SET NULL och skriver över eventuella aktuella värden. SELECT lämnar istället variabeln oförändrad, keeping vilket värde den redan hade. Denna skillnad spelar roll när variabeln började med ett värde som inte är NULL.

En tabellvariabel, deklarerad som DECLARE @t TABLE(…), lagrar en liten resultatmängd begränsad till en batch. Till skillnad från en #temp-tabell finns den bara i sin batch, kan inte ändras efter skapandet och passar ofta för små datamängder.

En lokal variabel är begränsad till den batch, lagrade proceduren eller triggern där den deklareras, inom en session. Nyckelordet GO avslutar en batch, så en variabel som deklarerats före GO kan inte refereras efter den.

En variabel kan använda nästan vilken SQL Server som helst data typ, inklusive int, decimal, varchar, nvarchar, date, datetime, bit och table. Matcha variabeln med den kolumn den representerar för att undvika implicita konverteringsfel.

Tilldela variabeln till sig själv med SET, till exempel SET @counter = @counter + 1. SELECT fungerar också: SELECT @total = @total + price. Detta mönster driver loopar och löpande totaler inuti skript och lagrade procedurer.

Ja. GitHub Copilot kan generera DECLARE-, SET- och SELECT-satser från kommentarer i naturligt språk och föreslå lämpliga datatyper. Granska alltid de genererade namnen, typerna och tilldelningslogiken mot ditt schema innan du kör det i produktion.

AI- och maskininlärningsassistenter trace hur variabler tar emot och skickar värden, flaggar oinitierade eller felaktigt skrivna variabler och föreslår setbaserade omskrivningar som ersätter långsamma variabeldrivna loopar. Utvecklaren bekräftar fortfarande varje ändring mot faktiska data och arbetsbelastning.

Sammanfatta detta inlägg med: