表达式(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

符号和运算符的一种组合,SQL Server 数据库引擎将处理该组合以获得单个数据值。 简单表达式可以是一个常量、变量、列或标量函数。 可以用运算符将两个或更多的简单表达式联接起来组成复杂表达式。

Transact-SQL 语法约定

语法

-- Syntax for SQL Server and 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 for Azure Synapse Analytics and 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 ]  
  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

术语 定义
constant 表示单个特定数据值的符号。 有关详细信息,请参阅常量 (Transact-SQL)
scalar_function 一个 Transact-SQL 语法单元,用于提供特定服务并返回单个值。 scalar_function 可以是内置标量函数(如 SUM、GETDATE 或 CAST 函数),也可以是标量用户定义函数
[ table_name. ] 表的名称或别名。
column 列的名称。 表达式中只允许列的名称。
variable 变量或参数的名称。 有关详细信息,请参阅 DECLARE @local_variable (Transact-SQL)
( expression ) 本主题中定义的任意一个有效表达式。 括号是分组运算符,用于确保先运算括号内表达式中的运算符,然后再将结果与别的表达式组合。
( scalar_subquery ) 返回一个值的子查询。 例如:

SELECT MAX(UnitPrice)

FROM Products
{ unary_operator } 一元运算符只能用于计算结果数据类型属于数字数据类型类别的表达式。 只有一个数字操作数的运算符:

+ 指示正数。

- 指示负数。

~ 指示一的补数运算符。
{ binary_operator } 用于定义如何组合两个表达式以得到一个结果的运算符。 binary_operator 可以是算术运算符、赋值运算符 (=)、位运算符、比较运算符、逻辑运算符、字符串连接运算符 (+) 或一元运算符。 有关运算符的详细信息,请参阅运算符 (Transact-SQL)
ranking_windowed_function 任意 Transact-SQL 排名函数。 有关详细信息,请参阅排名函数 (Transact-SQL)
aggregate_windowed_function 任意包含 OVER 子句的 Transact-SQL 聚合函数。 有关详细信息,请参阅 OVER 子句 (Transact-SQL)

表达式结果

对于由单个常量、变量、标量函数或列名组成的简单表达式,其数据类型、排序规则、精度、小数位数和值就是它所引用的元素的数据类型、排序规则、精度、小数位数和值。

用比较运算符或逻辑运算符组合两个表达式时,生成的数据类型为 Boolean,并且值为下列类型之一:TRUE、FALSE 或 UNKNOWN。 有关 Boolean 数据类型的详细信息,请参阅比较运算符 (Transact-SQL)

用算术运算符、位运算符或字符串运算符组合两个表达式时,生成的数据类型取决于运算符。

由多个符号和运算符组成的复杂表达式的计算结果为单值结果。 生成的表达式的数据类型、排序规则、精度和值由进行组合的两个表达式决定,并按每次两个表达式的顺序递延,直到得出最后结果。 表达式中元素组合的顺序由表达式中运算符的优先级决定。

注解

两个表达式可以由一个运算符组合起来,只要它们具有该运算符支持的数据类型,并且满足至少下列一个条件:

  • 两个表达式有相同的数据类型。

  • 优先级低的数据类型可以隐式转换为优先级高的数据类型。

如果表达式不满足这些条件,则可以使用 CAST 或 CONVERT 函数将优先级低的数据类型显式转化为优先级高的数据类型,或者转换为一种可以隐式转化成优先级高的数据类型的中间数据类型。

如果没有支持的隐式或显式转换,则两个表达式将无法组合。

任何计算结果为字符串的表达式的排序规则都应遵循排序规则优先顺序规则。 有关详细信息,请参阅 排序规则优先顺序 (Transact-SQL)

在 C 或 Microsoft Visual Basic 这类编程语言中,表达式的计算结果始终为单值结果。 Transact-SQL 选择列表中的表达式按以下规则进行变体:分别对结果集中的每一行计算表达式的值。 同一个表达式对结果集内的每一行可能会有不同的值,但该表达式在每一行的值是唯一的。 例如,在 SELECT 语句中,对 ProductID 的引用以及选择列表中的术语 1+2 都是表达式:

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

结果集中的每个行的表达式 1+2 的计算结果都为 3。 虽然表达式 ProductID 在结果集的每一行中产生一个唯一值,但每一行只有一个 ProductID 值。

  • Azure Synapse Analytics 为每个线程分配固定的最大内存量,因此,任何线程都无法占用所有内存。 其中一些内存用于存储查询的表达式。 如果查询包含太多表达式,并且其所需内存超出内部限制,则引擎不会执行该查询。 若要避免发生此问题,用户可以将查询更改为多个查询,使每个查询包含较少的表达式。 例如,在 WHERE 子句中有一个具有许多表达式的查询:
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 */

将此查询更改为:

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

另请参阅

AT TIME ZONE (Transact-SQL)
CASE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
COALESCE (Transact-SQL)
数据类型转换(数据库引擎)
数据类型优先级 (Transact-SQL)
数据类型 (Transact-SQL)
内置函数 (Transact-SQL)
LIKE (Transact-SQL)
NULLIF (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)