开发CLR数据库对象:用户定义函数

日期: 2009-10-20 作者:McGraw-Hill翻译:冯昀晖 来源:TechTarget中国 英文

.NET CLR集成还有另一个新特性:那就是可以创建基于.NET的用户定义函数(UDF,user-defined function)。返回标量类型的用户定义函数必须返回一个.NET数据类型,该.NET数据类型可以隐式地转换为SQL Server数据类型。用.NET Framework编写的纯量函数在某些情况下使用起来比T-SQL更方便,因为它跟T-SQL函数不一样,.NET函数是用编译的代码创建的。用户定义函数还可以返回table类型,在这种情况下,函数必须返回一个结果集。

  要使用Visual Studio 2005创建用户定义函数(UDF),需要先选择“新建|项目”选项,然后选择SQL ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

.NET CLR集成还有另一个新特性:那就是可以创建基于.NET的用户定义函数(UDF,user-defined function)。返回标量类型的用户定义函数必须返回一个.NET数据类型,该.NET数据类型可以隐式地转换为SQL Server数据类型。用.NET Framework编写的纯量函数在某些情况下使用起来比T-SQL更方便,因为它跟T-SQL函数不一样,.NET函数是用编译的代码创建的。用户定义函数还可以返回table类型,在这种情况下,函数必须返回一个结果集。

  要使用Visual Studio 2005创建用户定义函数(UDF),需要先选择“新建|项目”选项,然后选择SQL Server项目模板。如下图3-7所示:

  图3-7:创建一个新的SQL Server 用户定义函数项目

  就像前面展示的存储过程的例子一样,首先指定项目名称,然后点击确定创建项目。在本例中,如下图3-7所示,你可以看到我用“ufn_GetDateAsString”作为我的用户定义函数名称。该函数返回一个包含系统日期和时间的字符串值。在指定了项目名称之后,点击“确定”就会显示CLR函数项目的“新建数据库引用”对话框,如图3-8所示:

  注意:当已经存在数据库引用时,显示的就是“添加数据库引用”对话框,而不是“新建数据库引用”对话框。如果你在创建了“usp_ImportFile ”项目之后立即就创建“ufn_GetDateAsString”函数,就会出现这种情况。

  图3-8:新建数据库引用对话框

  “新建数据库引用”对话框定义了Visual Studio项目和SQL Server之间的连接。该项目会连接到名为“sql2005”的SQL Server系统,该函数将被部署到AdventureWorks数据库。

  Visual Studio项目创建了,连接也定义了,接下来你就可以点击“项目|添加函数”菜单选项,显示“添加新项目”对话框。如图3-9所示:

  图3-9:添加CLR用户定义函数

  Visual Studio使用“SQL Server函数”项目模板创建了一个启动项目,其中包含对SQL Server .NET数据提供器的引用和你源代码的基本函数包装。你可以根据需要添加剩下的代码。下面的代码就是完整的CLR函数“ufn_GetDateAsString”,该函数执行一个日期转换为字符串的基本功能:

  Imports System
  Imports System.Data
  Imports System.Data.Sql
  Imports System.Data.SqlTypes
  Imports Microsoft.SqlServer.Server
  Partial Public Class UserDefinedFunctions
  _
  Public Shared Function ufn_GetDateAsString() As SqlString
  Dim dtDataTime As New DateTime
  Return dtDataTime.ToString()
  End Function

  这里不需要Microsoft.SqlServer.Server命名空间,因为这个函数不执行任何数据访问的功能。接下来,Visual Studio 2005会生成“UserDefinedFunctions”类,其中包含了本程序集将作为用户定义函数展示的所有方法。你还可以看到用来把“GetDateAsString”方法标记为用户定义函数的属性。本段代码只是一个简单的示例,只是把系统时间转换为字符串数据类型,然后返回给调用者。

  部署该函数

  要在SQL Server数据库中创建函数,首先必须像你在前面的存储过程的例子中看到的那样创建程序集。如果你用的是Visual Studio 2005,那么你可以简单地选择“构建|部署解决方案”选项,一切就完成了。

  如果你是手工来做,你需要把“ufn_GetDataAsString.dll”文件复制到某个位置(SQL Server系统要可以访问到该位置),然后创建关于该函数的程序集。下面的CREATE ASSEMBLY语句可以用来把“ufn_GetDateAsString.dll”的内容复制到SQL Server数据库:

  CREATE ASSEMBLY ufn_GetDataAsString

  FROM 'MyFileShareCode Libraryufn_GetDataAsString.dll'

  然后使用“CREATE FUNCTION”语句创建新的在程序集中执行相应方法的SQL Server函数。下面的代码段展示了使用“CREATE FUNCTION”语句创建.CLR用户定义函数的方法:

  CREATE FUNCTION ufn_GetDateAsString()

  RETURNS nvarchar(256)

  EXTERNAL NAME

  ufn_GetDateAsString.UserDefinedFunctions.ufn_GetDateAsString

  对于用户定义函数,“CREATE FUNCTION”语句扩展使用了“EXTERNAL NAME”从句,它本质上就是连接了用户定义函数名与.NET程序集中相应的方法。在本例中,“fn_GetDateAsString”函数使用名为“fn_GetDateAsString”的程序集。在程序集内部,它使用的是“UserDefinedFunctions”类和类里的“ufn_GetDateAsString”方法。

  使用该函数

  函数创建以后,它可以被常规SQL Server函数调用。在下面的例子中你可以看到怎样执行GetDateAsString函数。

  SELECT dbo.GetDateAsString()

  End Class

相关推荐