Dela via


Expressions (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

En kombination av symboler och operatorer som SQL Server Database Engine utvärderar för att få ett enda datavärde. Enkla uttryck kan vara en enda konstant, variabel, kolumn eller skalär funktion. Operatorer kan användas för att koppla två eller flera enkla uttryck till ett komplext uttryck.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server och Azure SQL Database.

{ constant | scalar_function | [ table_name. ] column | variable
    | ( expression ) | ( scalar_subquery )
    | { unary_operator } expression
    | expression { binary_operator } expression
    | ranking_windowed_function | aggregate_windowed_function
}

Syntax för Azure Synapse Analytics och Parallel Data Warehouse.

-- Expression in a SELECT statement
<expression> ::=
{
    constant
    | scalar_function
    | column
    | variable
    | ( expression )
    | { unary_operator } expression
    | expression { binary_operator } expression
}
[ COLLATE Windows_collation_name ]

-- Scalar Expression in a DECLARE , SET , IF...ELSE , or WHILE statement
<scalar_expression> ::=
{
    constant
    | scalar_function
    | variable
    | ( expression )
    | (scalar_subquery )
    | { unary_operator } expression
    | expression { binary_operator } expression
}
[ COLLATE [ Windows_collation_name ] ]

Arguments

constant

En symbol som representerar ett enda, specifikt datavärde. Mer information finns i Konstanter.

scalar_function

En enhet med Transact-SQL syntax som tillhandahåller en specifik tjänst och returnerar ett enda värde. scalar_function kan vara inbyggda skalärfunktioner, till exempel SUMfunktionerna , GETDATE()eller CAST eller skalära användardefinierade funktioner.

table_name

Namnet eller aliaset för en tabell.

column

Namnet på en kolumn. Endast namnet på kolumnen tillåts i ett uttryck.

variable

Namnet på en variabel eller parameter. Mer information finns i DECLARE @local_variable.

expression

Alla giltiga uttryck enligt definitionen i den här artikeln. Parenteserna är grupperingsoperatorer som ser till att alla operatorer i uttrycket inom parenteserna utvärderas innan det resulterande uttrycket kombineras med ett annat.

scalar_subquery

En underfråga som returnerar ett värde. For example:

SELECT MAX(UnitPrice)
FROM Products;

unary_operator

Unary-operatorer kan endast tillämpas på uttryck som utvärderas för någon av datatyperna i kategorin numerisk datatyp. Är en operator som bara har en numerisk operand:

  • + anger ett positivt tal
  • - anger ett negativt tal
  • ~ anger ens komplementoperator

binary_operator

En operator som definierar hur två uttryck kombineras för att ge ett enda resultat. binary_operator kan vara en aritmetikoperator, tilldelningsoperatorn (=), en bitvis operator, en jämförelseoperator, en logisk operator, strängsammanfogningsoperatorn (+) eller en unary-operator. Mer information om operatorer finns i Operatorer.

ranking_windowed_function

Valfri Transact-SQL rangordningsfunktion. Mer information finns i Rankningsfunktioner.

aggregate_windowed_function

Alla Transact-SQL mängdfunktioner med OVER-satsen. Mer information finns i SELECT - OVER-satsen.

Expression results

För ett enkelt uttryck som består av en enda konstant, variabel, skalär funktion eller kolumnnamn: datatypen, sorteringen, precisionen, skalan och värdet för uttrycket är datatypen, sorteringen, precisionen, skalan och värdet för det refererade elementet.

När två uttryck kombineras med hjälp av jämförelseoperatorer eller logiska operatorer är den resulterande datatypen boolesk och värdet är antingen: TRUE, FALSEeller UNKNOWN. Mer information om booleska datatyper finns i Jämförelseoperatorer.

När två uttryck kombineras med hjälp av aritmetiska operatorer, bitvis eller strängoperatorer avgör operatorn den resulterande datatypen.

Komplexa uttryck som består av många symboler och operatorer utvärderas till ett resultat med en enda värde. Datatypen, sorteringen, precisionen och värdet för det resulterande uttrycket bestäms genom att komponentuttrycken kombineras, två i taget, tills ett slutligt resultat har uppnåtts. Sekvensen där uttrycken kombineras definieras av operatorernas prioritet i uttrycket.

Remarks

Två uttryck kan kombineras av en operator om båda har datatyper som stöds av operatorn, och minst ett av dessa villkor är sant:

  • Uttrycken har samma datatyp.

  • Datatypen med den lägre prioriteten kan implicit konverteras till datatypen med högre prioritet för datatypen.

Om uttrycken inte uppfyller dessa villkor CAST kan funktionerna eller CONVERT användas. Använd CAST eller CONVERT för att explicit konvertera datatypen med lägre prioritet till antingen datatypen med högre prioritet eller till en mellanliggande datatyp som implicit kan konverteras till datatypen med högre prioritet.

Om det inte finns någon implicit eller explicit konvertering som stöds kan de två uttrycken inte kombineras.

Sortering av alla uttryck som utvärderas till en teckensträng anges genom att följa reglerna för sorteringsprioritet. Mer information finns i sorteringsprioritet.

I ett programmeringsspråk som C eller Microsoft Visual Basic utvärderas alltid ett uttryck till ett enda resultat. Uttryck i en Transact-SQL välj lista följer en variant av den här regeln: Uttrycket utvärderas individuellt för varje rad i resultatuppsättningen. Ett enda uttryck kan ha ett annat värde i varje rad i resultatuppsättningen, men varje rad har bara ett värde för uttrycket. I följande SELECT instruktion är till exempel både referensen till ProductID och termen 1+2 i urvalslistan uttryck:

USE AdventureWorks2022;
GO

SELECT ProductID, 1 + 2
FROM Production.Product;
GO

Uttrycket 1+2 utvärderas till 3 i varje rad i resultatuppsättningen. Även om uttrycket ProductID genererar ett unikt värde i varje resultatuppsättningsrad, har varje rad bara ett värde för ProductID.

  • Azure Synapse Analytics allokerar en fast maximal mängd minne till varje tråd så att ingen tråd kan använda allt minne. En del av det här minnet används för att lagra frågors uttryck. Om en fråga har för många uttryck och det minne som krävs överskrider den interna gränsen kör inte motorn den. För att undvika det här problemet kan användare ändra frågan till flera frågor med mindre antal uttryck i varje. Du har till exempel en fråga med en lång lista med uttryck i WHERE-satsen:
DELETE
FROM dbo.MyTable
WHERE (c1 = '0000001' AND c2 = 'A000001')
    OR (c1 = '0000002' AND c2 = 'A000002')
    OR (c1 = '0000003' AND c2 = 'A000003')
/* ... additional, similar expressions omitted for simplicity */

Ändra den här frågan till:

DELETE FROM dbo.MyTable WHERE (c1 = '0000001' AND c2 = 'A000001');
DELETE FROM dbo.MyTable WHERE (c1 = '0000002' AND c2 = 'A000002');
DELETE FROM dbo.MyTable WHERE (c1 = '0000003' AND c2 = 'A000003');
/* ... refactored, individual DELETE statements omitted for simplicity  */