如何:通过使用公共语言运行时集成创建和运行 SQL Server 聚合
通过将**“聚合”**项添加到 SQL Server 公共语言运行时 (SQL CLR) 数据库项目,从而创建 SQL Server 聚合。 部署成功后,将像调用和执行任何其他 SQL Server 聚合一样调用和执行用托管代码创建的聚合。
SQL Server 聚合要求实现四个特定方法:Init、Accumulate、Merge 和 Terminate。 有关更多信息,请参见 Microsoft 网站上 SQL Server 联机丛书中的 CLR 用户定义聚合的要求。
提示
显示的对话框和菜单命令可能会与帮助中描述的那些有所不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
创建 SQL Server 聚合
创建 SQL Server 聚合
打开一个现有的**“SQL CLR 数据库项目”**,或者创建一个新项目。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目。
在**“项目”菜单上选择“添加新项”**。
在**“添加新项”对话框中,选择“聚合”**。
输入新聚合的**“名称”**。
添加执行聚合时要运行的代码。 请参见此过程后面的第一个示例。
将聚合部署到 SQL Server。 有关更多信息,请参见如何:将 SQL CLR 数据库项目项部署到 SQL Server。
重要事项 SQL Server 2005 和 SQL Server 2008 只支持使用 .NET Framework 2.0、3.0 或 3.5 版生成的 SQL Server 项目。 如果您尝试部署SQL Server项目,SQL Server 2005或SQL Server 2008,将显示错误消息: Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(在进行校验是您要部署的程序集的名称)。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目。
通过在 SQL Server 上执行聚合对其进行调试。 请参见此过程后面的第二个示例。
示例
此示例创建对元音计数的聚合。 此聚合对字符串数据类型的列中的元音计数。 聚合包含以下四个需要的方法,可以运行多线程: 初始化,积累、 合并和终止。
Imports System
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
<Serializable()>
<SqlUserDefinedAggregate(Format.Native)>
Public Structure CountVowels
' count only the vowels in the passed-in strings
Private countOfVowels As SqlInt32
Public Sub Init()
countOfVowels = 0
End Sub
Public Sub Accumulate(ByVal value As SqlString)
Dim stringChar As String
Dim indexChar As Int32
' for each character in the given parameter
For indexChar = 0 To Len(value.ToString()) - 1
stringChar = value.ToString().Substring(indexChar, 1)
If stringChar.ToLower() Like "[aeiou]" Then
' it is a vowel, increment the count
countOfVowels = countOfVowels + 1
End If
Next
End Sub
Public Sub Merge(ByVal value As CountVowels)
Accumulate(value.Terminate())
End Sub
Public Function Terminate() As SqlString
Return countOfVowels.ToString()
End Function
End Structure
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[SqlUserDefinedAggregate(Format.Native)]
public struct CountVowels
{
// count only the vowels in the passed-in strings
private SqlInt32 countOfVowels;
public void Init()
{
countOfVowels = 0;
}
public void Accumulate(SqlString value)
{
// list of vowels to look for
string vowels = "aeiou";
// for each character in the given parameter
for (int i=0; i < value.ToString().Length; i++)
{
// for each character in the vowels string
for (int j=0; j < vowels.Length; j++)
{
// convert parameter character to lowercase and compare to vowel
if (value.Value.Substring(i,1).ToLower() == vowels.Substring(j,1))
{
// it is a vowel, increment the count
countOfVowels+=1;
}
}
}
}
public void Merge(CountVowels value)
{
Accumulate(value.Terminate());
}
public SqlString Terminate()
{
return countOfVowels.ToString();
}
}
部署聚合之后,在 SQL Server 上执行它并验证是否返回正确的数据,从而对聚合进行测试。 此查询返回对 Contact 表中 LastNames 列的所有值的元音计数的结果集。
提示
如果您使用的是 AdventureWorks2005,请将示例 Transact-SQL 代码中的 Person.Person 替换为 Person.Contact。
SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Person
GROUP BY LastName
ORDER BY LastName
请参见
任务
如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目
如何:通过使用公共语言运行时集成创建和运行 SQL Server 存储过程
如何:通过使用公共语言运行时集成创建和运行 SQL Server 触发器
如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的函数
如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的类型