函數 (Database Engine)
SQL Server 提供的內建函數,可用來執行某些特定的作業。
在下列情況下可使用或包括函數:
使用 SELECT 陳述式傳回值的查詢之選取清單。
SELECT DB_NAME(); GO
用於 SELECT 或資料修改 (SELECT、INSERT、DELETE 或 UPDATE) 陳述式的 WHERE 子句搜尋條件中,作為限制符合查詢的資料列之用。
USE AdventureWorks2008R2; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
用於檢視搜尋條件 (WHERE 子句),使檢視於執行階段動態地相容於使用者或環境。
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Person WHERE BusinessEntityID = SUSER_SID(); GO
任何運算式中。
插入資料時,CHECK 條件約束或觸發程序會尋找的指定值。
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
在未對 INSERT 陳述式指定值的情況下,DEFAULT 條件約束或觸發程序提供的值。
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
函數需要加上括號,即使未指定參數也不能省略。與關鍵字 DEFAULT 搭配使用的 Niladic 函數則是例外狀況。Niladic 函數不使用參數。如需 DEFAULT 關鍵字的詳細資訊,請參閱<ALTER TABLE (Transact-SQL)>和<CREATE TABLE (Transact-SQL)>。
指定資料庫、電腦、登入或資料庫使用者的參數,有時候是選擇性的。如果未指定上述參數,則預設值會是目前的資料庫、主機電腦、登入或資料庫使用者。
函數可以是巢狀的。
函數類別
下表列出 SQL Server 函數的類別。
函數類別 |
描述 |
---|---|
執行將多個值結合為一個值的作業。範例包括 COUNT、SUM、MIN 及 MAX。 |
|
傳回組態設定相關資訊的純量函數。 |
|
支援加密、解密、數位簽章以及數位簽章的驗證。 |
|
傳回有關資料指標狀態的資訊。 |
|
變更日期和時間值。 |
|
執行三角 (Trigonometric)、幾何 (Geometric) 與其他數值運算。 |
|
傳回資料庫與資料庫物件屬性的相關資訊。 |
|
傳回資料分割中每一資料列順序值的非決定性函數。 |
|
傳回可替代 Transact-SQL 陳述式中之資料表參考的資料列集。 |
|
傳回有關使用者與角色 (Role) 的資訊。 |
|
變更 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。 |
|
針對不同系統層級的選項與物件執行作業或報告。 |
|
傳回 SQL Server 效能的相關資訊。 |
|
變更 text 與 image 的值。 |
決定性與非決定性函數
在 SQL Server 中,函數被分類為具完全決定性、具決定性的或非決定性的。
針對一組特定的輸入值,如果函數一直傳回相同的結果,則函數具完全決定性。
至於使用者自訂函數,適用的決定性概念則較不嚴格。針對一組特定的輸入值與資料庫狀態,如果函數一直傳回相同的結果,則使用者自訂函數就具決定性。如果函數非完全決定性函數,則在資料存取型的函數時可以具有決定性。
以相同一組輸入值來重複呼叫非決定性的函數時,則可能傳回不同的結果。例如,函數 GETDATE() 不具決定性。SQL Server 會限制不具決定性的各種類別。因此,不具決定性的函數應該小心使用。
針對內建函數,具決定性與具完全決定性是相同的。針對 Transact-SQL 使用者自訂函數,系統會驗證定義,並防止非決定性函數的定義。但是,資料存取型函數或非結構描述繫結函數被視為不具完全決定性。針對 Common Language Runtime (CLR) 函數,函數定義會指定函數所具的決定性、資料存取和系統資料存取屬性,但是因為這些屬性不是由系統驗證,函數總是被視為不具完全決定性。
函數缺乏決定性可能會限制其可使用之處。在索引檢視、產生索引的已計算資料行、保存的計算資料行或 Transact-SQL 使用者自訂函數的定義中,只可叫用具決定性的函數。
函數缺乏完全決定性會封鎖寶貴的效能最佳化。為了嚴格確保正確性,會略過某些計畫重新調整順序的步驟。此外,使用者自訂函數的呼叫數量、順序和時間將視實作而定。不要依賴這些引動過程的語意。除了執行階段常數的非決定性內建 RAND 與 GETDATE 家族外,呼叫的數量、順序和時間也視所選擇的計畫而定。
最佳作法建議
建議您盡可能遵循下列指導方針:
1. 當您可以進行選擇時,寫入具完全決定性的函數。尤其要讓您的 Transact-SQL 函數成為結構描述繫結。
2. 限制非決定性函數使用最外側的選取清單。
3. 請勿在效能具決定性的查詢中使用非決定性函數。
4. 請勿依賴呼叫的數量、順序或時間,因為這些因素都視實作而定。
如需詳細資訊,請參閱<決定性與非決定性函數>。