Share via


如何:通过使用公共语言运行时集成创建和运行 SQL Server 聚合

通过将**“聚合”**项添加到 SQL Server 公共语言运行时 (SQL CLR) 数据库项目,从而创建 SQL Server 聚合。 部署成功后,将像调用和执行任何其他 SQL Server 聚合一样调用和执行用托管代码创建的聚合。

SQL Server 聚合要求实现四个特定方法:Init、Accumulate、Merge 和 Terminate。 有关更多信息,请参见 Microsoft 网站上 SQL Server 联机丛书中的 CLR 用户定义聚合的要求

提示

显示的对话框和菜单命令可能会与帮助中描述的那些有所不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置

创建 SQL Server 聚合

创建 SQL Server 聚合

  1. 打开一个现有的**“SQL CLR 数据库项目”**,或者创建一个新项目。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目

  2. 在**“项目”菜单上选择“添加新项”**。

  3. 在**“添加新项”对话框中,选择“聚合”**。

  4. 输入新聚合的**“名称”**。

  5. 添加执行聚合时要运行的代码。 请参见此过程后面的第一个示例。

  6. 将聚合部署到 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 公共语言运行时集成的数据库对象创建项目

  7. 通过在 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 用户定义的类型

演练:使用托管代码创建存储过程

如何:调试 SQL CLR 存储过程

参考

SQL CLR 数据库项目和数据库对象的特性

概念

SQL Server CLR 集成简介 (ADO.NET)

使用托管代码创建数据库对象的好处

在托管代码中创建 SQL Server 对象