表达式(Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

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

Transact-SQL 语法约定

语法

SQL Server 和 Azure SQL 数据库 的语法。

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

Azure Synapse Analytics 和并行数据仓库的语法。

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

表示单个特定数据值的符号。 有关详细信息,请参阅常量

scalar_function

一个 Transact-SQL 语法单元,提供特定服务并返回单个值。 scalar_function可以是内置标量函数,例如SUMGETDATE()函数或CAST标量用户定义的函数。

table_name

表的名称或别名。

column

列的名称。 表达式中只允许列的名称。

variable

变量或参数的名称。 有关详细信息,请参阅 DECLARE @local_variable

expression

本文中定义的任何有效表达式。 括号是分组运算符,用于确保先运算括号内表达式中的运算符,然后再将结果与别的表达式组合。

scalar_subquery

返回一个值的子查询。 例如:

SELECT MAX(UnitPrice)
FROM Products;

unary_operator

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

  • + 指示正数
  • - 指示负数
  • ~ 指示一个补数运算符

binary_operator

定义两个表达式组合方式以生成单个结果的运算符。 binary_operator可以是算术运算符、赋值运算符 (=)、按位运算符、比较运算符、逻辑运算符、字符串串联运算符 (+) 或一元运算符。 有关运算符的详细信息,请参阅 运算符

ranking_windowed_function

任何 Transact-SQL 排名函数。 有关详细信息,请参阅 排名函数

aggregate_windowed_function

具有 OVER 子句的任何 Transact-SQL 聚合函数。 有关详细信息,请参阅 SELECT - OVER 子句

表达式结果

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

使用比较或逻辑运算符组合两个表达式时,生成的数据类型为布尔值,值为: TRUEFALSEUNKNOWN。 有关布尔数据类型的详细信息,请参阅 比较运算符

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

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

注解

如果两个表达式都具有运算符支持的数据类型,则运算符可以组合两个表达式,并且其中至少一个条件为 true:

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

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

如果表达式不符合这些条件, CAST 可以使用或 CONVERT 函数。 使用 CASTCONVERT 显式将优先级较低的数据类型转换为优先级较高的数据类型,或显式转换为可隐式转换为具有较高优先级的数据类型的中间数据类型。

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

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

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