Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Zmienna lokalna Transact-SQL to obiekt, który może przechowywać pojedynczą wartość danych określonego typu. Zmienne w partiach i skryptach są zwykle używane:
- W miarę licznika liczba wykonanych pętli lub kontrolowanie, ile razy jest wykonywana pętla.
- Aby przechowywać wartość danych do przetestowania za pomocą instrukcji control-of-flow.
- Aby zapisać wartość danych, która ma być zwracana przez kod zwracany przez procedurę składowaną lub wartość zwracaną funkcji.
Remarks
Nazwy niektórych funkcji systemu Transact-SQL zaczynają się od dwóch znaków (@@). Chociaż we wcześniejszych wersjach programu SQL Server @@ funkcje są określane jako zmienne globalne, @@ funkcje nie są zmiennymi i nie mają takich samych zachowań jak zmienne. Funkcje @@ to funkcje systemowe, a ich składnia jest zgodna z regułami dotyczącymi funkcji.
Nie można używać zmiennych w widoku.
Zmiany zmiennych nie mają wpływu na wycofanie transakcji.
Deklarowanie zmiennej Transact-SQL
Instrukcja DECLARE inicjuje zmienną Transact-SQL przez:
Przypisywanie nazwy. Nazwa musi mieć jeden
@znak jako pierwszy.Przypisywanie typu danych zdefiniowanych przez system lub użytkownika oraz długość. W przypadku zmiennych liczbowych przypisywana jest również precyzja i skala. W przypadku zmiennych typu XML można przypisać opcjonalną kolekcję schematów.
Ustawienie wartości na
NULL.
Na przykład poniższa DECLARE instrukcja tworzy zmienną lokalną o nazwie @mycounter z typem danych int . Domyślnie wartość tej zmiennej to NULL.
DECLARE @MyCounter INT;
Aby zadeklarować więcej niż jedną zmienną lokalną, użyj przecinka po zdefiniowaniu pierwszej zmiennej lokalnej, a następnie określ następną nazwę zmiennej lokalnej i typ danych.
Na przykład następująca DECLARE instrukcja tworzy trzy zmienne lokalne o nazwie @LastName, @FirstName i @StateProvinceinicjuje każdy z nich na :NULL
DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);
W innym przykładzie poniższa DECLARE instrukcja tworzy zmienną logiczną o nazwie @IsActive, która jest zadeklarowana jako bit z wartością 0 (false):
DECLARE @IsActive BIT = 0;
Zakres zmienny
Zakres zmiennej to zakres instrukcji Transact-SQL, które mogą odwoływać się do zmiennej. Zakres zmiennej trwa od momentu zadeklarowania do końca partii lub procedury składowanej, w której jest zadeklarowany. Na przykład następujący skrypt generuje błąd składni, ponieważ zmienna jest zadeklarowana w jednej partii (oddzielonej GO słowem kluczowym) i odwołuje się do niej w innej:
USE AdventureWorks2022;
GO
DECLARE @MyVariable INT;
SET @MyVariable = 1;
GO
SELECT BusinessEntityID,
NationalIDNumber,
JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;
Zmienne mają zakres lokalny i są widoczne tylko w ramach partii lub procedury, w której są zdefiniowane. W poniższym przykładzie zagnieżdżony zakres utworzony do wykonania sp_executesql nie ma dostępu do zmiennej zadeklarowanej w wyższym zakresie i zwraca i zwraca błąd.
DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error
Ustawianie wartości w zmiennej Transact-SQL
Po pierwszym zadeklarowaniu zmiennej jej wartość jest ustawiona na NULL. Aby przypisać wartość do zmiennej, użyj instrukcji SET . Jest to preferowana metoda przypisywania wartości do zmiennej. Zmienna może również mieć przypisaną wartość, odwołując się do niej na liście select instrukcji SELECT .
Aby przypisać zmienną wartość przy użyciu instrukcji SET, dołącz nazwę zmiennej i wartość do przypisania do zmiennej. Jest to preferowana metoda przypisywania wartości do zmiennej. Na przykład następująca partia deklaruje dwie zmienne, przypisuje do nich wartości, a następnie używa ich w WHERE klauzuli instrukcji SELECT :
USE AdventureWorks2022;
GO
-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
@PostalCodeVariable NVARCHAR(15);
-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';
-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
FirstName,
JobTitle,
City,
StateProvinceName,
CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
OR PostalCode = @PostalCodeVariable;
GO
Zmienna może również mieć przypisaną wartość, odwołując się do niej na liście wyboru. Jeśli zmienna jest przywoływana na liście zaznaczeń, powinna mieć przypisaną wartość skalarną lub SELECT instrukcja powinna zwracać tylko jeden wiersz. Przykład:
USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;
SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO
Warning
Jeśli w jednej SELECT instrukcji istnieje wiele klauzul przypisania, program SQL Server nie gwarantuje kolejności obliczania wyrażeń. Efekty są widoczne tylko wtedy, gdy istnieją odwołania do przypisań.
SELECT Jeśli instrukcja zwraca więcej niż jeden wiersz, a zmienna odwołuje się do wyrażenia niepodstawnego, zmienna jest ustawiona na wartość zwracaną dla wyrażenia w ostatnim wierszu zestawu wyników. Na przykład w następującej partii @EmpIDVariable jest ustawiona BusinessEntityID wartość ostatniego zwracanego wiersza, czyli 1:
USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;
SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;
SELECT @EmpIDVariable;
GO
Examples
Poniższy skrypt tworzy małą tabelę testową i wypełnia ją 26 wierszami. Skrypt używa zmiennej do wykonywania trzech czynności:
- Określ, ile wierszy jest wstawionych, kontrolując, ile razy jest wykonywana pętla.
- Podaj wartość wstawioną do kolumny całkowitej.
- Funkcja w ramach wyrażenia, które generuje litery do wstawienia do kolumny znaków.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO
SET NOCOUNT ON;
GO
-- Declare the variable to be used.
DECLARE @MyCounter INT;
-- Initialize the variable.
SET @MyCounter = 0;
-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
-- Insert a row into the table.
INSERT INTO TestTable
VALUES
-- Use the variable to provide the integer value
-- for cola. Also use it to generate a unique letter
-- for each row. Use the ASCII function to get the
-- integer value of 'a'. Add @MyCounter. Use CHAR to
-- convert the sum back to the character @MyCounter
-- characters after 'a'.
(
@MyCounter,
CHAR((@MyCounter + ASCII('a')))
);
-- Increment the variable to count this iteration
-- of the loop.
SET @MyCounter = @MyCounter + 1;
END;
GO
SET NOCOUNT OFF;
GO
-- View the data.
SELECT cola, colb FROM TestTable;
GO
DROP TABLE TestTable;
GO