PILIH @local_variable (Transact-SQL)

Berlaku untuk:SQL ServerDatabase Azure SQLInstans Terkelola Azure SQLAzure Synapse AnalyticsTitik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Mengatur variabel lokal ke nilai ekspresi.

Untuk menetapkan variabel, gunakan SET @local_variable alih-alih SELECT @local_variable.

Konvensi sintaks transact-SQL

Syntax

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ , ...n ] [ ; ]

Arguments

@local_variable

Variabel yang dideklarasikan yang Anda tetapkan nilainya.

{ = | += | -= | *= | /= | %= | &= | ^= | |=}

Tetapkan nilai di sebelah kanan ke variabel di sebelah kiri.

Operator penetapan gabungan:

Operator Action
= Menetapkan ekspresi yang mengikuti, ke variabel .
+= Menambahkan dan menetapkan
-= Mengurangi dan menetapkan
*= Mengalikan dan menetapkan
/= Membagi dan menetapkan
%= Modulo dan tetapkan
&= Bitwise AND dan tetapkan
^= Bitwise XOR dan tetapkan
|= Bitwise OR dan tetapkan

expression

Ekspresi apa pun yang valid. Istilah ini mencakup subkueri skalar.

Remarks

Gunakan SELECT @local_variable untuk mengembalikan satu nilai ke dalam variabel. Namun, ketika ekspresi adalah nama kolom, ekspresi dapat mengembalikan beberapa nilai. SELECT Jika pernyataan mengembalikan lebih dari satu nilai, variabel mendapatkan nilai terakhir yang dikembalikan kueri.

SELECT Jika pernyataan tidak mengembalikan baris, variabel menyimpan nilainya saat ini. Jika ekspresi adalah subkueri skalar yang tidak mengembalikan nilai, variabel diatur ke NULL.

Satu SELECT pernyataan dapat menginisialisasi beberapa variabel lokal.

Note

Anda tidak dapat menggunakan SELECT pernyataan yang berisi penetapan variabel untuk juga melakukan operasi pengambilan tataan hasil yang khas.

Examples

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

Database AdventureWorksLT digunakan sebagai database sampel untuk Azure SQL Database.

A. Gunakan SELECT @local_variable untuk mengembalikan satu nilai

Dalam contoh berikut, variabel @var1 mendapatkan nilai 'Generic Name'. Kueri terhadap Store tabel tidak mengembalikan baris karena nilai yang ditentukan CustomerID tidak ada dalam tabel. Variabel menyimpan nilai "Nama Generik".

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;

SELECT @var1 AS 'ProductName';

Berikut set hasilnya.

ProductName
------------------------------
Generic Name

B. Gunakan SELECT @local_variable untuk mengembalikan null

Dalam contoh berikut, subkueri menetapkan nilai ke @var1. Karena nilai yang diminta CustomerID tidak ada, subkueri tidak mengembalikan nilai, dan variabel diatur ke NULL.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
                FROM SalesLT.Product
                WHERE ProductID = 1000000);

SELECT @var1 AS 'Company Name';

Berikut set hasilnya.

Company Name
----------------------------
NULL

C. Penggunaan antipattern dari penetapan variabel rekursif

Hindari pola berikut untuk penggunaan variabel dan ekspresi rekursif:

SELECT @Var = <expression containing @Var>
FROM
...

Dalam hal ini, tidak dijamin bahwa @Var diperbarui berdasarkan baris demi baris. Misalnya, @Var mungkin diatur ke nilai @Var awal untuk semua baris. Perilaku ini terjadi karena urutan dan frekuensi di mana penugasan diproses tidak menentukan. Aturan ini berlaku untuk ekspresi yang berisi perangkaian string variabel, seperti yang ditunjukkan dalam contoh berikut, tetapi juga untuk ekspresi dengan variabel non-string atau += operator gaya. Gunakan fungsi agregasi sebagai gantinya untuk operasi berbasis set alih-alih operasi baris demi baris.

Untuk perangkaian string, pertimbangkan fungsi STRING_AGG, yang diperkenalkan pada SQL Server 2017 (14.x), untuk skenario di mana perangkaian string yang diurutkan diinginkan. Untuk informasi selengkapnya, lihat STRING_AGG.

Contoh berikut menunjukkan antipattern yang harus dihindari. Menggunakan ORDER BY dalam upaya untuk mengurutkan perangkaian menyebabkan daftar tidak lengkap:

DECLARE @List AS NVARCHAR (MAX);

SELECT @List = CONCAT(COALESCE (@List + ', ', ''), p.LastName)
FROM Person.Person AS p
WHERE p.FirstName = 'William'
ORDER BY p.BusinessEntityID;

SELECT @List;

Berikut set hasilnya.

(No column name)
---
Walker

Sebagai gantinya, pertimbangkan:

DECLARE @List AS NVARCHAR (MAX);

SELECT @List = STRING_AGG(p.LastName, ', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
FROM Person.Person AS p
WHERE p.FirstName = 'William';

SELECT @List;

Berikut set hasilnya.

(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker