使用者自訂函數設計指導方針

使用者自訂函數是以資料庫物件的形式儲存,可提供能夠以下列方式重複使用的程式碼:

  • 在 Transact-SQL 陳述式中,例如 SELECT

  • 在呼叫函數的應用程式中

  • 在另一個使用者自訂函數的定義中

  • 若要將檢視參數化,或改善索引檢視的功能

  • 若要在資料表中定義資料行

  • 若要在資料行上定義 CHECK 條件約束

  • 若要取代預存程序

選擇函數的類型

設計使用者自訂函數時,請先決定最符合您需求的函數類型。函數是否將要:

  • 傳回純量 (單一值)

  • 傳回資料表 (多個資料列)

  • 執行複雜計算

  • 主要存取 SQL Server 資料

以 Transact-SQL 或 .NET Framework 撰寫的使用者自訂函數,可以傳回純量和資料表值。

函數的屬性

無論是透過呼叫函數之計算資料行上的索引,還是透過參考函數的索引檢視,使用者自訂函數都有幾項屬性可決定 SQL Server Database Engine 為函數的結果編製索引的能力。這些屬性也適用於 CLR 使用者定義型別的方法。

決定性

假設資料庫狀態相同,任何時候以特定的輸入值集來呼叫決定性函數時,一律會傳回相同的結果。即使所存取的資料庫維持在相同的狀態,每次以特定的輸入值集來呼叫非決定性函數時,都會傳回不同的結果。

Database Engine 會自動分析 Transact-SQL 函數的主體,並評估函數是否為決定性。例如,如果函數呼叫其他非決定性函數,或如果函數呼叫擴充預存程序,則 Database Engine 就會將函數標示為非決定性。若是 Common Language Runtime (CLR) 函數,則 Database Engine 會倚賴函數的作者將函數標示為決定性,或標示為不使用 SqlFunction 自訂屬性。

精確度

如果使用者自訂函數未牽涉到任何浮點運算,便可稱為精確的函數。

Database Engine 會自動分析 Transact-SQL 函數的主體,評估函數是否精確。若是 CLR 函數,則 Database Engine 會依賴函數的作者將函數標示為精確,或標示為不使用 SqlFunction 自訂屬性。

資料存取

這個屬性指出函數是否會使用 SQL Server 同處理序 Managed 提供者來存取本機資料庫伺服器。如需詳細資訊,請參閱<從 CLR 資料庫物件進行資料存取>。

Database Engine 會自動分析 Transact-SQL 函數的主體,評估函數是否執行資料存取。若是 CLR 函數,則 Database Engine 會依賴函數的作者使用 SqlFunction 自訂屬性來指出資料存取特性。Database Engine 將會在執行階段強制執行此屬性。如果函數指出 DataAccess = None,但又執行資料存取,則函數會在執行階段失敗。

系統資料存取

這個屬性指出函數是否會使用 SQL Server 同處理序 Managed 提供者來存取系統中繼資料。

Database Engine 會自動分析 Transact-SQL 函數的主體,評估函數是否執行系統資料存取。若是 CLR 函數,則 Database Engine 會依賴函數的作者使用 SqlFunction 自訂屬性來指出系統資料存取特性。Database Engine 將會在執行階段強制執行此屬性。如果函數指出 SystemDataAccess = None,但又執行系統資料存取,則函數會在執行階段失敗。

IsSystemVerified

此屬性指出 Database Engine 是否可以驗證函數的決定性和精確度屬性。只要 Transact-SQL 函數未呼叫任何標示 IsSystemVerified = false 的函數,這個屬性就為 true。若是 CLR 函數,則這個屬性為 false。

Database Engine 會自動衍生函數的 IsSystemVerified 屬性。若是 Transact-SQL 函數,如它們存取了任何標示 IsSystemVerified = false 的函數,則函數本身也會標示 IsSystemVerified = false。

如需有關索引計算資料行與索引檢視中的函數詳細資訊,請參閱<在計算資料行上建立索引>和<建立索引檢視>。