函數 (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 函數的類別。

函數類別

描述

彙總函式 (Transact-SQL)

執行將多個值結合為一個值的作業。範例包括 COUNT、SUM、MIN 及 MAX。

組態函數

傳回組態設定相關資訊的純量函數。

加密函數 (Transact-SQL)

支援加密、解密、數位簽章以及數位簽章的驗證。

資料指標函數

傳回有關資料指標狀態的資訊。

日期和時間函數

變更日期和時間值。

數學函數

執行三角 (Trigonometric)、幾何 (Geometric) 與其他數值運算。

中繼資料函數

傳回資料庫與資料庫物件屬性的相關資訊。

排名函數

傳回資料分割中每一資料列順序值的非決定性函數。

資料列集函數 (Transact-SQL)

傳回可替代 Transact-SQL 陳述式中之資料表參考的資料列集。

安全性函數

傳回有關使用者與角色 (Role) 的資訊。

字串函數

變更 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。

系統函數

針對不同系統層級的選項與物件執行作業或報告。

系統統計函數 (Transact-SQL)

傳回 SQL Server 效能的相關資訊。

Text 與 Image 函數

變更 text 與 image 的值。

決定性與非決定性函數

在 SQL Server 中,函數被分類為具完全決定性、具決定性的或非決定性的。

針對一組特定的輸入值,如果函數一直傳回相同的結果,則函數具完全決定性。

至於使用者自訂函數,適用的決定性概念則較不嚴格。針對一組特定的輸入值與資料庫狀態,如果函數一直傳回相同的結果,則使用者自訂函數就具決定性。如果函數非完全決定性函數,則在資料存取型的函數時可以具有決定性。

以相同一組輸入值來重複呼叫非決定性的函數時,則可能傳回不同的結果。例如,函數 GETDATE() 不具決定性。SQL Server 會限制不具決定性的各種類別。因此,不具決定性的函數應該小心使用。

針對內建函數,具決定性與具完全決定性是相同的。針對 Transact-SQL 使用者自訂函數,系統會驗證定義,並防止非決定性函數的定義。但是,資料存取型函數或非結構描述繫結函數被視為不具完全決定性。針對 Common Language Runtime (CLR) 函數,函數定義會指定函數所具的決定性、資料存取和系統資料存取屬性,但是因為這些屬性不是由系統驗證,函數總是被視為不具完全決定性。

函數缺乏決定性可能會限制其可使用之處。在索引檢視、產生索引的已計算資料行、保存的計算資料行或 Transact-SQL 使用者自訂函數的定義中,只可叫用具決定性的函數。

函數缺乏完全決定性會封鎖寶貴的效能最佳化。為了嚴格確保正確性,會略過某些計畫重新調整順序的步驟。此外,使用者自訂函數的呼叫數量、順序和時間將視實作而定。不要依賴這些引動過程的語意。除了執行階段常數的非決定性內建 RAND 與 GETDATE 家族外,呼叫的數量、順序和時間也視所選擇的計畫而定。

最佳作法建議

建議您盡可能遵循下列指導方針:

1. 當您可以進行選擇時,寫入具完全決定性的函數。尤其要讓您的 Transact-SQL 函數成為結構描述繫結。

2. 限制非決定性函數使用最外側的選取清單。

3. 請勿在效能具決定性的查詢中使用非決定性函數。

4. 請勿依賴呼叫的數量、順序或時間,因為這些因素都視實作而定。

如需詳細資訊,請參閱<決定性與非決定性函數>。