運算式 (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
SQL Server 資料庫引擎 評估為取得單一數據值之符號和運算子的組合。 簡單運算式可以是單一常數、變數、資料行或純量函數。 運算子可用來將兩個或更多簡單運算式聯結成複雜運算式。
Syntax
SQL Server 和 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
}
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 ] ]
引數
constant
表示單一特定數據值的符號。 如需詳細資訊,請參閱常數。
scalar_function
Transact-SQL 語法的單位,可提供特定服務並傳回單一值。 scalar_function可以是內建純量函式,例如SUM
、 GETDATE()
或 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 子句。
表達式結果
單一常數、變數、純量函數或資料行名稱所組成的簡單運算式:運算式的資料類型、定序、有效位數、小數位數和值,就是所參考之元素的資料類型、定序、有效位數、小數位數和值。
當使用比較或邏輯運算子結合兩個運算式時,產生的數據類型為布林值,且值為: TRUE
、 FALSE
或 UNKNOWN
。 如需布爾值數據類型的詳細資訊,請參閱 比較運算符。
當利用算術、位元或字串運算子來組合兩個運算式時,運算子會決定產生的資料類型。
許多符號和運算子組成的複雜運算式會評估得出單值結果。 產生之運算式的資料類型、定序、有效位數和值取決於元件運算式的組合,每次兩個,直到到達最終結果為止。 運算式的組合順序是由運算式中的運算子優先順序所定義。
備註
如果兩個運算式都有運算子支援的數據類型,而且至少有一個條件成立,則運算元可以合併兩個運算式:
運算式有相同的資料類型。
優先順序較低的資料類型可以隱含地轉換成優先順序較高的資料類型。
如果表達式不符合這些條件, CAST
可以使用 或 CONVERT
函式。 使用 CAST
或 CONVERT
,將優先順序較低的數據類型明確轉換成優先順序較高的數據類型,或是可以隱含轉換成優先順序較高的數據類型的中繼數據類型。
如果沒有支援的隱含或明確轉換,則無法合併這兩個表達式。
評估得出字元字串的任何運算式之定序,是由下列定序優先順序規則來設定的。 如需詳細資訊,請參閱 定序優先順序。
在 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 */