Baca dalam bahasa Inggris

Bagikan melalui


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.

Konvensi sintaks transact-SQL

Sintaks

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

Argumen

@local_variable

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

expression

Ekspresi apa pun yang valid. Ini termasuk subkueri skalar.

Keterangan

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.

Contoh

J. Gunakan SELECT @local_variable untuk mengembalikan satu nilai

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

B. Gunakan SELECT @local_variable untuk mengembalikan null

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

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 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

Lihat juga

Langkah berikutnya