.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中国
.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
作者
翻译
TechTarget特邀编辑。2003年入软件行业,熟悉软件过程所有环节,对机构信息化的各方面有深入理解和实践经验。现就职于某互联网创业公司,目前关注互联网分布式系统架构和机器学习。喜欢传统文化社科哲学(尤喜《周易》、《老子》),喜健身喜抓举(具备抱人引体向上的能力),喜欢中国象棋(具备盲棋1对2的能力)。
相关推荐
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。
-
Notre Dame对云端SQL Server性能基准的探索实践
确立SQL Server的性能基准,对于云端迁移来说是至关重要的第一步,一位来自于University of Notre Dame 的DBA表示,他正在试图通过数据库监控软件,找出SQL server的性能基准。
-
横向扩展SQL Server应用程序:提高工作负载的选项
SQL Server管理员面临的最大挑战之一就是扩展数据库以适应更为繁重的数据处理工作负载。然而事情越发复杂的是,虽然Microsoft提供了许多不同的SQL Server可扩展性选项,但它们并不都适合于每种情况。
-
五大技巧构建首个SQL Server容器
容器的世界庞大而复杂,使用者可能会感到困扰,这里我们将列出一些示例,以便引导您顺利完成SQL Server容器的创建和管理。