.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
作者
翻译
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。