SELECT @local_variable (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL ServerAzure SQL Database Azure SQL Managed Instance Azure Synapse Analytics SQL di Microsoft Fabric Warehouse dalam database Microsoft Fabric SQL di Microsoft Fabric
Mengatur variabel lokal ke nilai ekspresi.
Untuk menetapkan variabel, kami sarankan Anda menggunakan SET @local_variable alih-alih SELECT @local_variable.
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Variabel yang dideklarasikan yang nilainya akan ditetapkan.
{ =
|=
^=
| | | &=
%=
| /=
| | | *=
| +=
-=
}
Tetapkan nilai di sebelah kanan ke variabel di sebelah kiri.
Operator penetapan gabungan:
Operator | Perbuatan |
---|---|
= | Menetapkan ekspresi yang mengikuti, ke variabel . |
+= | Menambahkan dan menetapkan |
-= | Mengurangi dan menetapkan |
*= | Mengalikan dan menetapkan |
/= | Membagi dan menetapkan |
%= | Modulo dan tetapkan |
&= | Bitwise DAN dan tetapkan |
^= | Bitwise XOR dan tetapkan |
|= | Bitwise ATAU dan tetapkan |
Ekspresi apa pun yang valid. Ini termasuk subkueri skalar.
SELECT @local_variable biasanya digunakan untuk mengembalikan satu nilai ke dalam variabel. Namun, ketika ekspresi adalah nama kolom, ekspresi dapat mengembalikan beberapa nilai. Jika pernyataan SELECT mengembalikan lebih dari satu nilai, variabel diberi nilai terakhir yang dikembalikan.
Jika pernyataan SELECT tidak mengembalikan baris, variabel akan mempertahankan nilainya saat ini. Jika ekspresi adalah subkueri skalar yang tidak mengembalikan nilai, variabel diatur ke NULL.
Satu pernyataan SELECT dapat menginisialisasi beberapa variabel lokal.
Catatan
Pernyataan SELECT yang berisi penetapan variabel tidak dapat digunakan untuk juga melakukan operasi pengambilan tataan hasil yang khas.
Dalam contoh berikut, variabel @var1
ditetapkan "Nama Generik" sebagai nilainya. Kueri terhadap Store
tabel tidak mengembalikan baris karena nilai yang ditentukan CustomerID
tidak ada dalam tabel. Variabel mempertahankan nilai "Nama Generik".
Contoh ini menggunakan AdventureWorksLT
database sampel, untuk informasi selengkapnya, lihat Database sampel AdventureWorks. Database AdventureWorksLT
digunakan sebagai database sampel untuk Azure SQL Database.
-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';
Berikut set hasilnya.
ProductName
------------------------------
Generic Name
Dalam contoh berikut, subkueri digunakan untuk menetapkan nilai ke @var1
. Karena nilai yang diminta CustomerID
tidak ada, subkueri tidak mengembalikan nilai, dan variabel diatur ke NULL
.
Contoh ini menggunakan AdventureWorksLT
database sampel, untuk informasi selengkapnya, lihat Database sampel AdventureWorks. Database AdventureWorksLT
digunakan sebagai database sampel untuk Azure SQL Database.
-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist
SELECT @var1 AS 'Company Name';
Berikut set hasilnya.
Company Name
----------------------------
NULL
Hindari pola berikut untuk penggunaan variabel dan ekspresi rekursif:
SELECT @Var = <expression containing @Var>
FROM
...
Dalam hal ini, tidak dijamin bahwa @Var
akan diperbarui berdasarkan baris demi baris. Misalnya, @Var
dapat diatur ke nilai @Var
awal untuk semua baris. Ini karena urutan dan frekuensi di mana penugasan diproses tidak menentukan. Ini berlaku untuk ekspresi yang berisi perangkaian string variabel, seperti yang ditunjukkan di bawah ini, 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, sebagai gantinya STRING_AGG
pertimbangkan fungsi, diperkenalkan di SQL Server 2017 (14.x), untuk skenario di mana perangkaian string yang diurutkan diinginkan. Untuk informasi selengkapnya, lihat STRING_AGG (Transact-SQL).
Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022
database sampel atau AdventureWorksDW2022
, yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.
Contoh untuk dihindari, di mana 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;
Tataan hasil:
(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;
Tataan hasil:
(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