SELECT @local_variable (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsMicrosoft Fabric'te SQL analitiği uç noktasıMicrosoft Fabric'te DepoMicrosoft Fabric'te SQL veritabanı

Bir ifadenin değerine yerel değişken ayarlar.

Değişkenleri atamak için yerine SELECT @local_variablekullanınSET @local_variable.

Transact-SQL söz dizimi kuralları

Syntax

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

Arguments

@local_variable

Değer atadığınız bildirilen değişken.

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

Sağdaki değeri soldaki değişkene atayın.

Bileşik atama işleci:

Operator Action
= Aşağıdaki ifadeyi değişkenine atar.
+= Ekleme ve atama
-= Çıkarma ve atama
*= Çarpma ve atama
/= Bölme ve atama
%= Modulo ve atama
&= Bit düzeyinde AND ve atama
^= Bit düzeyinde XOR ve atama
|= Bit düzeyinde OR ve atama

expression

Herhangi bir geçerli ifade. Bu terim bir skaler alt sorgu içerir.

Remarks

değişkenine tek bir değer döndürmek için kullanın SELECT @local_variable . Ancak ifade bir sütunun adı olduğunda birden çok değer döndürebilir. SELECT Deyimi birden fazla değer döndürürse, değişken sorgunun döndürdüğü son değeri alır.

SELECT deyimi satır döndürmezse değişken geçerli değerini korur. İfade değer döndürmeden skaler bir alt sorguysa, değişkeni olarak NULLayarlanır.

Bir SELECT deyim birden çok yerel değişken başlatabilir.

Note

Tipik sonuç kümesi alma işlemlerini gerçekleştirmek için değişken ataması içeren bir deyimi kullanamazsınız SELECT .

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

Veritabanı AdventureWorksLT , Azure SQL Veritabanı için örnek veritabanı olarak kullanılır.

A. Tek bir değer döndürmek için SELECT @local_variable kullanma

Aşağıdaki örnekte değişkeni @var1 değerini 'Generic Name'alır. için belirtilen değer tabloda bulunmadığındanStore, tabloya yönelik sorgu CustomerID satır döndürmez. değişkeni "Genel Ad" değerini tutar.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

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

SELECT @var1 AS 'ProductName';

Sonuç kümesi aşağıdadır.

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

B. Null döndürmek için SELECT @local_variable kullanma

Aşağıdaki örnekte, bir alt sorgu öğesine @var1bir değer atar. için CustomerID istenen değer mevcut olmadığından, alt sorgu değer döndürmez ve değişkeni olarak NULLayarlanır.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

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

SELECT @var1 AS 'Company Name';

Sonuç kümesi aşağıdadır.

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

C. Özyinelemeli değişken atamasının kötü amaçlı kullanımı

Değişkenlerin ve ifadelerin özyinelemeli kullanımı için aşağıdaki desenden kaçının:

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

Bu durumda, satır temelinde güncelleştirildiği @Var garanti değildir. Örneğin, @Var tüm satırlar için başlangıç değerine @Var ayarlanabilir. Atamaların işlenme sırası ve sıklığı belirsiz olduğundan bu davranış oluşur. Bu kural, aşağıdaki örnekte gösterildiği gibi değişken dize birleştirmesi içeren ifadeler için, aynı zamanda dize olmayan değişkenlere veya += stil işleçlerine sahip ifadeler için de geçerlidir. Satır satır işlem yerine küme tabanlı bir işlem için toplama işlevlerini kullanın.

Dize birleştirme için, sıralı dize birleştirmenin istendiği senaryolar için SQL Server 2017'de (14.x) tanıtılan STRING_AGG işlevini göz önünde bulundurun. Daha fazla bilgi için bkz. STRING_AGG.

Aşağıdaki örnekte kaçınılması gereken bir kötü model gösterilmektedir. ORDER BY Birleştirmeyi sıralama girişiminde kullanmak listenin tamamlanmamış olmasını neden olur:

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;

Sonuç kümesi aşağıdadır.

(No column name)
---
Walker

Bunun yerine, şunu düşünün:

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;

Sonuç kümesi aşağıdadır.

(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