用户定义函数的设计指导原则

用户定义函数作为数据库对象存储,并提供可以按下列方式使用的可重用代码:

  • 在 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,但又执行系统数据访问,那么函数将在执行时失败。

IsSystemVerified

此属性指示数据库引擎是否可验证函数的确定性属性和精度属性。只要 Transact-SQL 函数不调用标记为 IsSystemVerified = false 的函数,这些函数的此属性就为 True。CLR 函数的此属性为 False。

数据库引擎会自动为函数派生 IsSystemVerified 属性。对于 Transact-SQL 函数,如果它们访问标记为 IsSystemVerified = false 的函数,这些函数本身将被标记为 IsSystemVerified = false。

有关索引计算列和索引视图中的函数的详细信息,请参阅为计算列创建索引创建索引视图