使用者自訂函數設計指導方針
使用者自訂函數是以資料庫物件的形式儲存,可提供能夠以下列方式重複使用的程式碼:
在 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。
如需有關索引計算資料行與索引檢視中的函數詳細資訊,請參閱<在計算資料行上建立索引>和<建立索引檢視>。