Aracılığıyla paylaş


DEKLARASYON @local_variable (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Değişkenler, deyimiyle DECLARE bir toplu iş veya yordamın gövdesinde bildirilir ve bir veya SET deyimi kullanılarak SELECT değerler atanır. İmleç değişkenleri bu deyimle bildirilebilir ve imleçle ilgili diğer deyimlerle birlikte kullanılabilir. Bildirimden sonra, bildirimin bir parçası olarak bir değer sağlanmadığı sürece tüm değişkenler olarak NULLbaşlatılır.

Transact-SQL söz dizimi kuralları

Syntax

Aşağıdaki söz dizimi SQL Server ve Azure SQL Veritabanı içindir:

DECLARE
{
  { @local_variable [AS] data_type [ = value ] }
  | { @cursor_variable_name CURSOR }
| { @table_variable_name [AS] <table_type_definition> }
} [ , ...n ]

<table_type_definition> ::=
    TABLE ( { <column_definition> | <table_constraint> | <table_index> } } [ , ...n ] )

<column_definition> ::=
    column_name { scalar_data_type | AS computed_column_expression }
    [ COLLATE collation_name ]
    [ [ DEFAULT constant_expression ] | IDENTITY [ (seed, increment ) ] ]
    [ ROWGUIDCOL ]
    [ <column_constraint> ]
    [ <column_index> ]

<column_constraint> ::=
{
    [ NULL | NOT NULL ]
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      [ WITH FILLFACTOR = fillfactor
        | WITH ( < index_option > [ , ...n ] )
      [ ON { filegroup | "default" } ]
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<column_index> ::=
    INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ , ... n ] ) ]
    [ ON { partition_scheme_name (column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

<table_constraint> ::=
{
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      ( column_name [ ASC | DESC ] [ , ...n ]
        [ WITH FILLFACTOR = fillfactor
        | WITH ( <index_option> [ , ...n ] )
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<table_index> ::=
{
    {
      INDEX index_name  [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
         (column_name [ ASC | DESC ] [ , ... n ] )
    | INDEX index_name CLUSTERED COLUMNSTORE
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ , ... n ] )
    }
    [ WITH ( <index_option> [ , ... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}

<index_option> ::=
{
  PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
  | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
       [ ON PARTITIONS ( { partition_number_expression | <range> }
       [ , ...n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ] ]
}

Aşağıdaki söz dizimi Azure Synapse Analytics ve Paralel Veri Ambarı ile Microsoft Fabric için geçerlidir:

DECLARE
{ { @local_variable [AS] data_type } [ = value [ COLLATE <collation_name> ] ] } [ , ...n ]

Arguments

@ local_variable

Değişkenin adı. Değişken adları (@) işaretiyle başlamalıdır. Yerel değişken adları , tanımlayıcıların kurallarına uymalıdır.

  • data_type

    Sistem tarafından sağlanan, ortak dil çalışma zamanı (CLR) kullanıcı tanımlı tablo türleri veya diğer ad veri türleri. Değişken metin, ntext veya görüntü veri türünde olamaz.

    Sistem veri türleri hakkında daha fazla bilgi için bkz. Veri türleri. CLR kullanıcı tanımlı türler veya diğer ad veri türleri hakkında daha fazla bilgi için bkz. CREATE TYPE.

  • = değer

    Değişkene satır içi bir değer atar. Değer bir sabit veya ifade olabilir, ancak değişken bildirim türüyle eşleşmesi veya örtük olarak bu türe dönüştürülebilir olması gerekir. Daha fazla bilgi için bkz. İfadeler.

@ cursor_variable_name

İmleç değişkeninin adı. İmleç değişkeni adları (@) işaretiyle başlamalı ve tanımlayıcıların kurallarına uymalıdır.

  • İMLEÇ

    Değişkenin yerel bir imleç değişkeni olduğunu belirtir.

  • @ table_variable_name

    Tablo türünde bir değişkenin adı. Değişken adları (@) işaretiyle başlamalı ve tanımlayıcıların kurallarına uymalıdır.

  • <table_type_definition>

    Tablo veri türünü tanımlar. Tablo bildirimi sütun tanımlarını, adları, veri türlerini ve kısıtlamaları içerir. İzin verilen tek kısıtlama türleri , PRIMARY KEY, UNIQUEve NULL'dırCHECK. Kural veya varsayılan tanım türe bağlıysa diğer ad veri türü sütun skaler veri türü olarak kullanılamaz.

<table_type_definition>

içinde CREATE TABLEbir tablo tanımlamak için kullanılan bilgi alt kümesi. Öğeler ve temel tanımlar buraya dahildir. Daha fazla bilgi için bkz. CREATE TABLE.

  • n

    Birden çok değişkenin belirtilebileceğini ve atanabileceğini belirten bir yer tutucu. Tablo değişkenleri bildirildiğinde, tablo değişkeni deyiminde DECLARE bildirilen tek değişken olmalıdır.

column_name

Tablodaki sütunun adı.

  • scalar_data_type

    Sütunun bir skaler veri türü olduğunu belirtir.

  • computed_column_expression

    Hesaplanan sütunun değerini tanımlayan ifade. Aynı tablodaki diğer sütunlar kullanılarak bir ifadeden hesaplanır. Örneğin, hesaplanan sütun tanımına cost AS price * qtysahip olabilir. İfade, birleştirilmemiş bir sütun adı, sabit, yerleşik işlev, değişken veya bir veya daha fazla işleç tarafından bağlanan bu seçeneklerin herhangi bir bileşimi olabilir. İfade bir alt sorgu veya kullanıcı tanımlı işlev olamaz. İfade, CLR kullanıcı tanımlı bir türe başvuramaz.

[ DERLEME collation_name ]

Sütun için harmanlamayı belirtir. collation_name bir Windows harmanlama adı veya SQL harmanlama adı olabilir ve yalnızca char, varchar, text, nchar, nvarchar ve ntext veri türlerinin sütunları için geçerlidir. Belirtilmezse, sütuna kullanıcı tanımlı veri türünün harmanlaması (sütun kullanıcı tanımlı bir veri türündeyse) veya geçerli veritabanının harmanlaması atanır.

Windows ve SQL harmanlama adları hakkında daha fazla bilgi için bkz. HARMANLAMA.

DEFAULT

Ekleme sırasında açıkça bir değer sağlanmayan sütun için sağlanan değeri belirtir. DEFAULT tanımları, zaman damgası olarak tanımlanan sütunlar dışında veya özelliğiyle herhangi bir sütuna IDENTITY uygulanabilir. DEFAULT tanımları, tablo bırakıldığında kaldırılır. Karakter dizesi gibi yalnızca sabit bir değer; gibi bir SYSTEM_USER()sistem işlevi veya NULL varsayılan olarak kullanılabilir. SQL Server'ın önceki sürümleriyle uyumluluğu korumak için bir kısıtlama adı öğesine DEFAULTatanabilir.

  • constant_expression

    Sütunun varsayılan değeri olarak kullanılan sabit, NULLveya sistem işlevi.

IDENTITY

Yeni sütunun bir kimlik sütunu olduğunu gösterir. Tabloya yeni bir satır eklendiğinde, SQL Server sütun için benzersiz bir artımlı değer sağlar. Kimlik sütunları genellikle tablonun benzersiz satır tanımlayıcısı olarak görev yapmak için kısıtlamalarla PRIMARY KEY birlikte kullanılır. IDENTITY özelliği tinyint, smallint, int, decimal(p,0)veya sayısal (p,0) sütunlara atanabilir. Tablo başına yalnızca bir kimlik sütunu oluşturulabilir. Sınırlanmış varsayılanlar ve DEFAULT kısıtlamalar bir kimlik sütunuyla kullanılamaz. Hem tohumu hem de artışı belirtmeniz veya hiçbirini belirtmeniz gerekir. Hiçbiri belirtilmezse, varsayılan değer (1,1) olur.

  • seed

    Tabloya yüklenen ilk satır için kullanılan değer.

  • increment

    Yüklenen önceki satırın kimlik değerine eklenen artımlı değer.

ROWGUIDCOL

Yeni sütunun satır genel benzersiz tanımlayıcı sütunu olduğunu gösterir. Sütun olarak tablo başına yalnızca bir ROWGUIDCOL sütunu atanabilir. ROWGUIDCOL özelliği yalnızca bir benzersizleştirici sütununa atanabilir.

NULL | NOT NULL

Değişkende null'a izin verilip verilmediğini gösterir. Varsayılan değer: NULL.

BİRİNCİL ANAHTAR

Benzersiz bir dizin aracılığıyla belirli bir sütun veya sütun için varlık bütünlüğünü zorlayan kısıtlama. Tablo başına yalnızca bir PRIMARY KEY kısıtlama oluşturulabilir.

UNIQUE

Benzersiz bir dizin aracılığıyla belirli bir sütun veya sütunlar için varlık bütünlüğü sağlayan kısıtlama. Bir tablonun birden çok UNIQUE kısıtlaması olabilir.

KÜMELENDİ | KÜMELENMİDİ

veya PRIMARY KEY kısıtlaması için kümelenmiş veya kümelenmemiş bir dizin oluşturulduğunu UNIQUE belirtin. PRIMARY KEY kısıtlamaları kullanır CLUSTEREDve UNIQUE kısıtlamalar kullanır NONCLUSTERED.

CLUSTERED yalnızca bir kısıtlama için belirtilebilir. Bir CLUSTERED kısıtlama için belirtilirse ve bir UNIQUE kısıtlama da belirtilirsePRIMARY KEY, PRIMARY KEY kullanırNONCLUSTERED.

CHECK

Bir sütuna veya sütunlara girilebilen olası değerleri sınırlayarak etki alanı bütünlüğünü zorlayan bir kısıtlama.

  • logical_expression

    veya TRUEdöndüren FALSE mantıksal ifade.

<index_option>

Bir veya daha fazla dizin seçeneğini belirtir. Dizinler tablo değişkenlerinde açıkça oluşturulamaz ve tablo değişkenlerinde istatistik tutulmaz. SQL Server 2014 (12.x), tablo tanımıyla satır içinde belirli dizin türleri oluşturmanıza olanak tanıyan söz dizimi kullanıma sunulmuştur. Bu söz dizimini kullanarak, tablo tanımlarının bir parçası olarak tablo değişkenlerinde dizinler oluşturabilirsiniz. Bazı durumlarda, bunun yerine tam dizin desteği ve istatistikler sağlayan geçici tablolar kullanılarak performans artabilir.

Bu seçeneklerin tam açıklaması için bkz. CREATE TABLE.

Tablo değişkenleri ve satır tahminleri

Tablo değişkenlerinde dağıtım istatistikleri yoktur. Çoğu durumda iyileştirici, tablo değişkeninin sıfır satır veya bir satıra sahip olduğu varsayımı üzerine bir sorgu planı oluşturur. Daha fazla bilgi için tablo veri türü - Sınırlamalar ve kısıtlamalar'ı gözden geçirin.

Bu nedenle, daha fazla sayıda satır (100'den büyük) bekliyorsanız tablo değişkeni kullanma konusunda dikkatli olmanız gerekir. Aşağıdaki alternatifleri göz önünde bulundurun:

  • Satır sayımının daha büyük (100'den büyük) olması mümkün olduğunda, geçici tablolar tablo değişkenlerinden daha iyi bir çözüm olabilir.

  • Tablo değişkenini diğer tablolarla birleştiren sorgular için, iyileştiricinin RECOMPILE tablo değişkeni için doğru kardinaliteyi kullanmasına neden olan ipucunu kullanın.

  • Azure SQL Veritabanı'nda ve SQL Server 2019 (15.x) ile başlayarak, tablo değişkeni ertelenen derleme özelliği gerçek tablo değişkeni satır sayılarını temel alan kardinalite tahminlerini yayarak yürütme planını iyileştirmek için daha doğru bir satır sayısı sağlar. Daha fazla bilgi için bkz. SQL veritabanlarında akıllı sorgu işleme.

Remarks

Değişkenler genellikle bir toplu iş veya yordamda , WHILEveya bir LOOP blok için IF...ELSEsayaç olarak kullanılır.

Değişkenler yalnızca ifadelerde kullanılabilir, nesne adları veya anahtar sözcükler yerine kullanılamaz. Dinamik SQL deyimleri oluşturmak için kullanın EXECUTE.

Yerel değişkenin kapsamı, içinde bildirildiği toplu iştir.

Tablo değişkeninin bellekte yerleşik olması şart değildir. Bellek baskısı altında, bir tablo değişkenine ait sayfalar öğesine tempdbgönderilebilir.

Tablo değişkeninde satır içi dizin tanımlayabilirsiniz.

Şu anda kendisine atanmış bir imleç değişkenine kaynak olarak başvurabilirsiniz:

  • CLOSE beyanat
  • DEALLOCATE beyanat
  • FETCH beyanat
  • OPEN beyanat
  • Konumlandırılmış DELETE veya UPDATE deyimi
  • SET CURSOR değişken deyimi (sağ tarafta)

Bu deyimlerin tümlerinde, başvurulan bir imleç değişkeni varsa ancak şu anda buna ayrılmış bir imleç yoksa SQL Server bir hata oluşturur. Başvuruda bulunılan bir imleç değişkeni yoksa, SQL Server başka bir türdeki bildirilmemiş değişken için aynı hatayı oluşturur.

İmleç değişkeni:

  • bir imleç türünün veya başka bir imleç değişkeninin hedefi olabilir. Daha fazla bilgi için bkz. SET @local_variable.

  • İmleç değişkenine şu anda atanmış bir imleç yoksa, deyimdeki EXECUTE bir çıkış imleci parametresinin hedefi olarak başvurulabilir.

  • İmlecin işaretçisi olarak kabul edilmelidir.

Examples

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

A. DECLARE kullanma

Aşağıdaki örnekte, ile @findbaşlayan tüm aile adlarının kişi bilgilerini almak için adlı Man bir yerel değişken kullanılır.

USE AdventureWorks2022;
GO

DECLARE @find AS VARCHAR (30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/

SET @find = 'Man%';

SELECT p.LastName,
       p.FirstName,
       ph.PhoneNumber
FROM Person.Person AS p
     INNER JOIN Person.PersonPhone AS ph
         ON p.BusinessEntityID = ph.BusinessEntityID
WHERE LastName LIKE @find;

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

LastName            FirstName               Phone
------------------- ----------------------- -------------------------
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178

B. İki değişkenle DECLARE kullanma

Aşağıdaki örnek, Kuzey Amerika satış bölgesinde bulunan ve yıl için en az 2.000.000 ABD doları satış yapan Adventure Works Cycles satış temsilcilerinin adlarını alır.

USE AdventureWorks2022;
GO

SET NOCOUNT ON;
GO

DECLARE @Group AS NVARCHAR (50), @Sales AS MONEY;

SET @Group = N'North America';
SET @Sales = 2000000;
SET NOCOUNT OFF;

SELECT FirstName,
       LastName,
       SalesYTD
FROM Sales.vSalesPerson
WHERE TerritoryGroup = @Group
      AND SalesYTD >= @Sales;

C. Tablo türünde bir değişken bildirme

Aşağıdaki örnek, deyiminin yan tümcesinde tableOUTPUT belirtilen değerleri depolayan bir UPDATE değişken oluşturur. içindeki değerleri ve tablodaki SELECT güncelleştirme işleminin @MyTableVar sonuçlarını döndüren iki Employee deyim izler. Sütundaki INSERTED.ModifiedDate sonuçlar, tablodaki sütundaki ModifiedDateEmployee değerlerden farklıdır. Bunun nedeni AFTER UPDATE değerini geçerli tarihe güncelleştiren ModifiedDate tetikleyicinin tabloda tanımlanmasıdır Employee . Ancak, OUTPUT döndürülen sütunlar tetikleyiciler tetiklenmeden önce verileri yansıtır. Daha fazla bilgi için bkz . OUTPUT yan tümcesi.

USE AdventureWorks2022;
GO

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    OldVacationHours INT,
    NewVacationHours INT,
    ModifiedDate DATETIME);

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.BusinessEntityID,
    DELETED.VacationHours,
    INSERTED.VacationHours,
    INSERTED.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID,
       OldVacationHours,
       NewVacationHours,
       ModifiedDate
FROM @MyTableVar;
GO

--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) BusinessEntityID,
                VacationHours,
                ModifiedDate
FROM HumanResources.Employee;
GO

D. Satır içi dizinlerle tablo türünde bir değişken bildirme

Aşağıdaki örnek, kümelenmiş satır içi dizini ve iki kümelenmemiş satır içi dizini olan bir table değişken oluşturur.

DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    PRIMARY KEY CLUSTERED (EmpID),
    UNIQUE NONCLUSTERED (EmpID),
    INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID));
GO

Aşağıdaki sorgu, önceki sorguda oluşturulan dizinler hakkında bilgi döndürür.

SELECT * FROM tempdb.sys.indexes
WHERE object_id < 0;
GO

E. Kullanıcı tanımlı tablo türünün değişkenini bildirme

Aşağıdaki örnek adlı @LocationTVPtablo değerli bir parametre veya tablo değişkeni oluşturur. Bu adım, adlı LocationTableTypeilgili kullanıcı tanımlı tablo türünü gerektirir.

Kullanıcı tanımlı tablo türü oluşturma hakkında daha fazla bilgi için bkz. CREATE TYPE. Tablo değerli parametreler hakkında daha fazla bilgi için bkz. Tablo değerli parametreleri (Veritabanı Altyapısı) kullanma.

DECLARE @LocationTVP AS LocationTableType;

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

F. DECLARE kullanma

Aşağıdaki örnekte, ile @findbaşlayan tüm aile adlarının kişi bilgilerini almak için adlı Walt bir yerel değişken kullanılır.

-- Uses AdventureWorks
DECLARE @find AS VARCHAR (30);
/* Also allowed:
DECLARE @find VARCHAR(30) = 'Man%';
*/

SET @find = 'Walt%';

SELECT LastName,
       FirstName,
       Phone
FROM DimEmployee
WHERE LastName LIKE @find;

G. İki değişkenle DECLARE kullanma

Aşağıdaki örnek, tablodaki çalışanların DimEmployee ilk ve aile adlarını belirtmek için değişkenleri kullanır.

DECLARE @lastName AS VARCHAR (30),
    @firstName AS VARCHAR (30);

SET @lastName = 'Walt%';
SET @firstName = 'Bryan';

SELECT LastName,
       FirstName,
       Phone
FROM DimEmployee
WHERE LastName LIKE @lastName
      AND FirstName LIKE @firstName;