用户定义函数的设计指导原则
用户定义函数作为数据库对象存储,并提供可以按下列方式使用的可重用代码:
在 Transact-SQL 语句(如 SELECT)中
在调用该函数的应用程序中
在另一个用户定义函数的定义中
用于参数化视图或改进索引视图的功能
用于在表中定义列
用于为列定义 CHECK 约束
用于替换存储过程
选择函数类型
设计用户定义函数时,首先要确定最适合自己需要的函数类型。函数是否将:
返回一个标量(单个值)
返回一个表(多行)
执行一个复杂的计算
首先访问 SQL Server 数据
使用 Transact-SQL 或 .NET Framework 编写的用户定义函数可以同时返回标量值和表值。
函数的属性
有多种用户定义函数的属性可通过对调用函数的计算列进行索引或通过引用函数的索引视图,确定 SQL Server 数据库引擎为函数的结果建立索引的功能。这些属性也适用于 CLR 用户定义类型的方法。
确定性
只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。即使访问的数据库的状态不变,每次使用特定的输入值集调用非确定性函数都可能会返回不同的结果。
数据库引擎会自动分析 Transact-SQL 函数体并评估函数是否为确定性函数。例如,如果函数调用其他非确定性函数,或调用扩展存储过程,则数据库引擎会将该函数标记为非确定性函数。对于公共语言运行时 (CLR) 函数,数据库引擎通过函数的作者将函数标记为确定性函数或不使用 SqlFunction 自定义属性。
精度
如果用户定义函数不涉及任何浮点操作,就称其为精确函数。
数据库引擎会自动分析 Transact-SQL 函数体并评估函数是否为精确函数。对于 CLR 函数,数据库引擎通过函数的作者将函数标记为精确函数或不使用 SqlFunction 自定义属性。
数据访问
此属性指明函数是否使用 SQL Server 进程内托管提供程序访问本地数据库服务器。有关详细信息,请参阅从 CLR 数据库对象进行数据访问。
数据库引擎会自动分析 Transact-SQL 函数体并评估函数是否执行数据访问。对于 CLR 函数,数据库引擎通过函数的作者,使用 SqlFunction 自定义属性指示数据访问特征。执行时,数据库引擎将强制执行此属性。如果函数指明 DataAccess = None,但又执行数据访问,那么函数将在执行时失败。
系统数据访问
此属性指明函数是否使用 SQL Server 进程内托管提供程序访问本地数据库服务器中的系统元数据。
数据库引擎会自动分析 Transact-SQL 函数体并评估函数是否执行系统数据访问。对于 CLR 函数,数据库引擎通过函数的作者,使用 SqlFunction 自定义属性指示系统数据访问特征。执行时,数据库引擎将强制执行此属性。如果函数指明 SystemDataAccess = None,但又执行系统数据访问,那么函数将在执行时失败。