Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Variabelen worden gedeclareerd in de hoofdtekst van een batch of procedure met de DECLARE instructie en worden toegewezen waarden met behulp van een of een SET instructie SELECT . Cursorvariabelen kunnen worden gedeclareerd met deze instructie en worden gebruikt met andere cursorgerelateerde instructies. Na de declaratie worden alle variabelen geïnitialiseerd als NULL, tenzij er een waarde wordt opgegeven als onderdeel van de declaratie.
              
              
              Transact-SQL syntaxis-conventies
Syntax
De volgende syntaxis is voor SQL Server en Azure SQL Database:
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 ] ) ] ]
}
De volgende syntaxis is voor Azure Synapse Analytics en Parallel Data Warehouse en Microsoft Fabric:
DECLARE
{ { @local_variable [AS] data_type } [ = value [ COLLATE <collation_name> ] ] } [ , ...n ]
Arguments
@ local_variable
De naam van een variabele. Namen van variabelen moeten beginnen met een @-teken. Namen van lokale variabelen moeten voldoen aan de regels voor id's.
- data_type - Elk door het systeem opgegeven, common language runtime (CLR) door de gebruiker gedefinieerd tabeltype of aliasgegevenstype. Een variabele kan niet van het gegevenstype tekst, ntext of afbeelding zijn. - Zie Gegevenstypen voor meer informatie over systeemgegevenstypen. Zie CREATE TYPE voor meer informatie over door de gebruiker gedefinieerde CLR-typen of aliasgegevenstypen. 
- = waarde - Hiermee wordt een waarde toegewezen aan de variabele in de regel. De waarde kan een constante of een expressie zijn, maar moet overeenkomen met het type variabeledeclaratie of impliciet worden geconverteerd naar dat type. Zie Expressies voor meer informatie. 
@ cursor_variable_name
De naam van een cursorvariabele. Namen van cursorvariabelen moeten beginnen met een @-teken en voldoen aan de regels voor id's.
- CURSOR - Hiermee geeft u op dat de variabele een lokale cursorvariabele is. 
- @ table_variable_name - De naam van een variabele van het type tabel. Variabelenamen moeten beginnen met een @-teken en voldoen aan de regels voor id's. 
- <table_type_definition> - Hiermee definieert u het gegevenstype van de tabel . De tabeldeclaratie bevat kolomdefinities, namen, gegevenstypen en beperkingen. De enige toegestane beperkingstypen zijn - PRIMARY KEY,- UNIQUE,- NULLen- CHECK. Een aliasgegevenstype kan niet worden gebruikt als een gegevenstype scalaire kolom als een regel of standaarddefinitie afhankelijk is van het type.
<table_type_definition>
Een subset met informatie die wordt gebruikt voor het definiëren van een tabel in CREATE TABLE. Elementen en essentiële definities worden hier opgenomen. Zie CREATE TABLE voor meer informatie.
- n - Een tijdelijke aanduiding die aangeeft dat meerdere variabelen kunnen worden opgegeven en toegewezen waarden. Bij het declareren van tabelvariabelen moet de tabelvariabele de enige variabele zijn die in de - DECLAREinstructie wordt gedeclareerd.
column_name
De naam van de kolom in de tabel.
- scalar_data_type - Hiermee geeft u op dat de kolom een scalair gegevenstype is. 
- computed_column_expression - Een expressie die de waarde van een berekende kolom definieert. Deze wordt berekend op basis van een expressie met behulp van andere kolommen in dezelfde tabel. Een berekende kolom kan bijvoorbeeld de definitie - cost AS price * qtyhebben. De expressie kan een niet-berekende kolomnaam, constante, ingebouwde functie, variabele of een combinatie van deze opties zijn die zijn verbonden door een of meer operators. De expressie kan geen subquery of een door de gebruiker gedefinieerde functie zijn. De expressie kan niet verwijzen naar een door de gebruiker gedefinieerd CLR-type.
[ COLLATE collation_name ]
Hiermee geeft u de sortering voor de kolom. collation_name kan een Windows-sorteringsnaam of een SQL-sorteringsnaam zijn en is alleen van toepassing op kolommen van het teken, varchar, tekst, nchar, nvarchar en ntextgegevenstypen . Als deze niet is opgegeven, wordt de kolom toegewezen aan de sortering van het door de gebruiker gedefinieerde gegevenstype (als de kolom van een door de gebruiker gedefinieerd gegevenstype is) of de sortering van de huidige database.
Zie COLLATE voor meer informatie over de namen van Windows- en SQL-sorteringen.
DEFAULT
Hiermee geeft u de opgegeven waarde voor de kolom op wanneer een waarde niet expliciet wordt opgegeven tijdens een invoeging. 
              DEFAULT definities kunnen worden toegepast op kolommen, behalve kolommen die zijn gedefinieerd als tijdstempel of met de IDENTITY eigenschap. 
              DEFAULT definities worden verwijderd wanneer de tabel wordt verwijderd. Alleen een constante waarde, zoals een tekenreeks; een systeemfunctie, zoals een SYSTEM_USER(); of NULL als standaardfunctie kan worden gebruikt. Om compatibiliteit met eerdere versies van SQL Server te behouden, kan een beperkingsnaam worden toegewezen aan een DEFAULT.
- constant_expression - Een constante, - NULLof een systeemfunctie die wordt gebruikt als de standaardwaarde voor de kolom.
IDENTITY
Geeft aan dat de nieuwe kolom een identiteitskolom is. Wanneer er een nieuwe rij aan de tabel wordt toegevoegd, biedt SQL Server een unieke incrementele waarde voor de kolom. Identiteitskolommen worden vaak gebruikt met PRIMARY KEY beperkingen om te fungeren als de unieke rij-id voor de tabel. De IDENTITY eigenschap kan worden toegewezen aan kolommen met een kleineint, kleineint, int, decimal(p,0) of numeriek (p,0). Er kan slechts één identiteitskolom per tabel worden gemaakt. Afhankelijke standaardwaarden en DEFAULT beperkingen kunnen niet worden gebruikt met een identiteitskolom. U moet zowel het zaad als de verhoging opgeven, of geen van beide. Als geen van beide is opgegeven, is de standaardwaarde (1,1).
- seed - De waarde die wordt gebruikt voor de eerste rij die in de tabel is geladen. 
- increment - De incrementele waarde die is toegevoegd aan de identiteitswaarde van de vorige rij die is geladen. 
ROWGUIDCOL
Geeft aan dat de nieuwe kolom een globale unieke id-kolom voor rijen is. Er kan slechts één uniekeidentifierkolom per tabel worden aangewezen als de ROWGUIDCOL kolom. De ROWGUIDCOL eigenschap kan alleen worden toegewezen aan een uniekeidentifier-kolom .
NULL | NIET NULL
Geeft aan of null is toegestaan in de variabele. De standaardwaarde is NULL.
PRIMAIRE SLEUTEL
Een beperking die entiteitsintegriteit afdwingt voor een bepaalde kolom of kolommen via een unieke index. Er kan slechts één PRIMARY KEY beperking per tabel worden gemaakt.
UNIQUE
Een beperking die entiteitsintegriteit biedt voor een bepaalde kolom of kolommen via een unieke index. Een tabel kan meerdere UNIQUE beperkingen hebben.
GECLUSTERD | NIET-GECLUSTERD
Geef aan dat een geclusterde of niet-geclusterde index wordt gemaakt voor de PRIMARY KEY of UNIQUE beperking. 
              PRIMARY KEY
              CLUSTEREDgebruik van beperkingen en UNIQUE gebruik van beperkingenNONCLUSTERED.
              CLUSTERED kan worden opgegeven voor slechts één beperking. Als CLUSTERED wordt opgegeven voor een UNIQUE beperking en er ook een PRIMARY KEY beperking is opgegeven, wordt het PRIMARY KEY gebruik gebruikt NONCLUSTERED.
CHECK
Een beperking waarmee domeinintegriteit wordt afgedwongen door de mogelijke waarden te beperken die kunnen worden ingevoerd in een kolom of kolommen.
- logical_expression - Een logische expressie die retourneert - TRUEof- FALSE.
<index_option>
Hiermee geeft u een of meer indexopties. Indexen kunnen niet expliciet worden gemaakt voor tabelvariabelen en er worden geen statistieken op tabelvariabelen bewaard. SQL Server 2014 (12.x) heeft syntaxis geïntroduceerd waarmee u bepaalde indextypen inline kunt maken met de tabeldefinitie. Met deze syntaxis kunt u indexen maken voor tabelvariabelen als onderdeel van de tabeldefinitie. In sommige gevallen kunnen de prestaties worden verbeterd met behulp van tijdelijke tabellen, die volledige indexondersteuning en statistieken bieden.
Zie CREATE TABLE voor een volledige beschrijving van deze opties.
Tabelvariabelen en rijschattingen
Tabelvariabelen hebben geen distributiestatistieken. In veel gevallen bouwt de optimizer een queryplan op basis van de veronderstelling dat de tabelvariabele nul rijen of één rij heeft. Raadpleeg voor meer informatie het gegevenstype tabel - Beperkingen en beperkingen.
Daarom moet u voorzichtig zijn met het gebruik van een tabelvariabele als u een groter aantal rijen verwacht (groter dan 100). Houd rekening met de volgende alternatieven:
- Tijdelijke tabellen kunnen een betere oplossing zijn dan tabelvariabelen wanneer het mogelijk is dat het aantal rijen groter is (groter dan 100). 
- Voor query's die de tabelvariabele samenvoegen met andere tabellen, gebruikt u de - RECOMPILEhint, waardoor de optimizer de juiste kardinaliteit voor de tabelvariabele gebruikt.
- In Azure SQL Database en te beginnen met SQL Server 2019 (15.x) geeft de tabelvariabele uitgestelde compilatiefunctie kardinaliteitschattingen door die zijn gebaseerd op het werkelijke aantal tabelvariabele rijen, wat een nauwkeuriger aantal rijen biedt voor het optimaliseren van het uitvoeringsplan. Zie Intelligent queryverwerking in SQL-databases voor meer informatie. 
Remarks
Variabelen worden vaak gebruikt in een batch of procedure als meteritems voor WHILE, LOOPof voor een IF...ELSE blok.
Variabelen kunnen alleen worden gebruikt in expressies, niet in plaats van objectnamen of trefwoorden. Als u dynamische SQL-instructies wilt maken, gebruikt u EXECUTE.
Het bereik van een lokale variabele is de batch waarin deze wordt gedeclareerd.
Een tabelvariabele is niet noodzakelijkerwijs geheugenbewoner. Onder geheugendruk kunnen de pagina's die behoren tot een tabelvariabele worden gepusht naar tempdb.
U kunt een inline-index definiëren in een tabelvariabele.
Een cursorvariabele waaraan momenteel een cursor is toegewezen, kan worden verwezen als bron in een:
- 
              CLOSEverklaring
- 
              DEALLOCATEverklaring
- 
              FETCHverklaring
- 
              OPENverklaring
- 
              DELETEPositie ofUPDATEinstructie
- 
              SET CURSORvariabele instructie (aan de rechterkant)
In al deze instructies genereert SQL Server een fout als er een cursorvariabele bestaat waarnaar wordt verwezen, maar er momenteel geen cursor aan is toegewezen. Als er geen cursorvariabele waarnaar wordt verwezen, wordt in SQL Server dezelfde fout gegenereerd voor een niet-declaratieve variabele van een ander type.
Een cursorvariabele:
- Dit kan het doel zijn van een cursortype of een andere cursorvariabele. Zie SET @local_variable voor meer informatie. 
- In een - EXECUTEinstructie kan worden verwezen naar het doel van een parameter voor de uitvoercursor als aan de cursorvariabele momenteel geen cursor is toegewezen.
- Moet worden beschouwd als een aanwijzer naar de cursor. 
Examples
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
A. DECLARE gebruiken
In het volgende voorbeeld wordt een lokale variabele met de naam gebruikt @find om contactgegevens op te halen voor alle familienamen die beginnen met Man.
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;
Hier is het resultatenoverzicht.
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. DECLARE gebruiken met twee variabelen
In het volgende voorbeeld worden de namen van verkoopmedewerkers van Adventure Works Cycles opgehaald die zich in het Noord-Amerikaanse verkoopgebied bevinden en ten minste $ 2.000.000 in de verkoop voor het jaar hebben.
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. Een variabele van het type tabel declareren
In het volgende voorbeeld wordt een table variabele gemaakt waarin de waarden worden opgeslagen die zijn opgegeven in de OUTPUT component van de UPDATE instructie. Twee SELECT instructies volgen die de waarden in @MyTableVar en de resultaten van de updatebewerking in de Employee tabel retourneren. De resultaten in de INSERTED.ModifiedDate kolom verschillen van de waarden in de ModifiedDate kolom in de Employee tabel. Dit komt doordat de AFTER UPDATE trigger, die de waarde van ModifiedDate de huidige datum bijwerken, is gedefinieerd in de Employee tabel. De kolommen die worden geretourneerd uit OUTPUT weerspiegelen echter de gegevens voordat triggers worden geactiveerd. Zie de OUTPUT-component voor meer informatie.
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. Een variabele van het type tabel declareren, met inline-indexen
In het volgende voorbeeld wordt een table variabele gemaakt met een geclusterde inline-index en twee niet-geclusterde inlineindexen.
DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    PRIMARY KEY CLUSTERED (EmpID),
    UNIQUE NONCLUSTERED (EmpID),
    INDEX CustomNonClusteredIndex NONCLUSTERED (EmpID));
GO
De volgende query retourneert informatie over de indexen die in de vorige query zijn gemaakt.
SELECT * FROM tempdb.sys.indexes
WHERE object_id < 0;
GO
E. Een variabele van het door de gebruiker gedefinieerde tabeltype declareren
In het volgende voorbeeld wordt een tabelwaardeparameter of tabelvariabele gemaakt met de naam @LocationTVP. Voor deze stap is een bijbehorend door de gebruiker gedefinieerd tabeltype met de naam LocationTableTypevereist.
Zie CREATE TYPE voor meer informatie over het maken van een door de gebruiker gedefinieerd tabeltype. Zie Tabelwaardeparameters (Database Engine) gebruiken voor meer informatie over parameters met tabelwaarden.
DECLARE @LocationTVP AS LocationTableType;
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
F. DECLARE gebruiken
In het volgende voorbeeld wordt een lokale variabele met de naam gebruikt @find om contactgegevens op te halen voor alle familienamen die beginnen met Walt.
-- 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. DECLARE gebruiken met twee variabelen
In het volgende voorbeeld worden variabelen gebruikt om de voor- en familienamen van werknemers in de DimEmployee tabel op te geven.
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;