Share via


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

必须将特性应用于每个 SQL Server 项目以及项目包含的所有数据库对象。 可以使用 SQL Server 公共语言运行时集成 (SQL CLR) 创建以下类型的对象:

项目/文件

必须应用的特性

Project

SqlAssemblyAttribute

Aggregate

SqlUserDefinedAggregateAttribute

存储过程

SqlProcedureAttribute

触发器

SqlTriggerAttribute

用户定义的函数

SqlFunctionAttribute

用户定义的类型

SqlUserDefinedTypeAttribute

SqlAssembly 特性

此特性必须应用到向 SQL Server 数据库部署的所有程序集。 此特性没有任何参数。 当创建 SQL Server 项目时,该属性即被添加到 AssemblyInfo 文件。

SqlUserDefinedAggregate 特性

此特性必须应用到用户定义的聚集对象。 此属性具有两个属性: FormatandMaxByteSize.

  • Format
    必选。 聚合的存储格式。 支持的格式如下:

    Native - 指定 SQL Server 在磁盘上使用一种高效的本机表示形式。 该格式选项最为紧凑,并能提供最佳性能。 此格式的要求如下:

    • StructLayout.LayoutKindSequential 特性必须应用于该聚合。

    • 聚合的所有字段必须能直接复制到本机结构中,即它们在托管和非托管内存中必须有一种公共表示形式,并且不需要由互操作封送拆收器进行特殊处理。

    • 该聚合不能指定 MaxByteSize 的值。

    • 聚合不能有任何 [NonSerialized] 字段。

    • 字段不能标记为显式布局。

    UserDefined - 指定用户对二进制格式具有完全控制。 此格式的要求如下:

    • 该聚合必须实现 IBinarySerialize 接口。

    • 该聚合必须指定 MaxByteSize 的值。

  • MaxByteSize
    该聚合的实例的最大大小,以字节为单位。 仅当 Format 设置为 UserDefined 时是必需的。 不能在 Format 设置为 Native 时指定。

此示例指定聚合的 Format 为 Native。

<SqlUserDefinedAggregate(Format.Native)>
Public Class SampleAggregate
    '...
End Class
[SqlUserDefinedAggregate(Format.Native)]
public class SampleAggregate
{
   //...
}

SqlProcedure 特性

此特性必须应用于存储过程对象。 此特性具有以下参数:

  • Name - 可选项。 指定 SQL Server 上用于引用存储过程的名称。

此示例指定使用名称 sp_sqlName 引用存储过程。

Partial Public Class StoredProcedures

    <SqlProcedure(Name:="sp_sqlName")>
    Public Shared Sub SampleProcedure(ByVal s As SqlString)
        '...
    End Sub
End Class
public partial class StoredProcedures
{
    [SqlProcedure(Name="sp_sqlName")]
    public static void SampleProcedure(SqlString s)
    {
        //...
    }
}

SqlTrigger 特性

该特性必须应用于触发器对象。 此特性具有以下参数:

  • Name - 可选项。 指定在 SQL Server 上用于引用触发器的名称。

  • Target - 必选项。 指定应用触发器的目标。 目标的类型取决于您所创建的目标的类型。 可以创建 DDL、DML 或 LOGON 触发器。 最常见的触发器类型应用于表格。

  • Event - 必选项。 指定激活触发器的操作。

此示例指定通过更新 authors 表中的现有数据 (UPDATE) 来激活触发器。

Partial Public Class Triggers

    <SqlTrigger(Target:="authors", Event:="FOR UPDATE")>
    Public Shared Sub AuthorsUpdateTrigger()

        '...
    End Sub
End Class
public partial class Triggers
{
    [SqlTrigger(Target="authors", Event="FOR UPDATE")]
    public static void AuthorsUpdateTrigger()
    {
        //...
    }
}

此示例指定使用名称 trig_onpubinsert 引用触发器。 通过向 publishers 表中添加新数据 (INSERT) 来激活触发器。

Partial Public Class Triggers

    <SqlTrigger(Name:="trig_onpubinsert", Target:="publishers", Event:="FOR INSERT")>
    Public Shared Sub PublishersInsertTrigger()

        '...
    End Sub
End Class
public partial class Triggers
{
    [SqlTrigger(Name="trig_onpubinsert", Target="publishers", Event="FOR INSERT")]
    public static void PublishersInsertTrigger()
    {
        //...
    }
}

SqlFunction 特性

此特性必须应用于可返回标量值或表的用户定义的函数对象。 此特性具有以下参数:

  • Name - 可选项。 指定在 SQL Server 上用于引用用户定义函数的名称。

    提示

    对于返回值为表的函数,必须指定其 TableDefinition 属性值,该属性值包含所返回表的定义的 Transact-SQL 表示形式。

此示例指定使用名称 sp_scalarFunc 引用用户定义的函数。

Partial Public Class UserDefinedFunctions

    <SqlFunction(Name:="sp_scalarFunc")> 
    Public Shared Function SampleScalarFunction(ByVal s As SqlString) As SqlString

        '...
        Return ""
    End Function
End Class
public partial class UserDefinedFunctions
{
    [SqlFunction(Name="sp_scalarFunc")]
    public static SqlString SampleScalarFunction(SqlString s)
    {
        //...
        return "";
    }
}

此示例指定使用名称 sp_tableFunc 引用用户定义的函数。 TableDefinition 属性具有值 letter nchar(1)。

Partial Public Class UserDefinedFunctions

    <SqlFunction(Name:="sp_tableFunc", TableDefinition:="letter nchar(1)")> 
    Public Shared Function SampleTableFunction(ByVal s As SqlString) As IEnumerable

        '...
        Return New Char(2) {"a"c, "b"c, "c"c}
    End Function
End Class
public partial class UserDefinedFunctions
{
    [SqlFunction(Name="sp_tableFunc", TableDefinition="letter nchar(1)")]
    public static IEnumerable SampleTableFunction(SqlString s)
    {
        //...
        return new ArrayList(new char[3] {'a', 'b', 'c'});
    }
}

SqlUserDefinedType 特性

此特性必须应用于用户定义的类型对象。 此属性具有四个属性: Format、MaxByteSize、IsFixedLength 和 IsByteOrdered。

  • Format
    必选。 用户定义的类型的存储格式。 支持的格式如下:

    Native - 指定 SQL Server 在磁盘上使用一种高效的本机表示形式。 这是最精简的选择,通常会产生最好的性能。 此格式的要求如下:

    • StructLayout.LayoutKindSequential 特性必须应用于该类型。

    • 用户定义类型的所有字段必须能直接复制到本机结构中,即它们在托管和非托管内存中必须有一种公共表示形式,并且不需要互操作封送拆收器进行特殊处理。

    • 该类型不能指定 MaxByteSize 的值。

    • 该类型不能有任何 [NonSerialized] 字段。

    • 字段不能标记为显式布局。

    UserDefined - 指定用户对二进制格式具有完全控制。 此格式的要求如下:

    • 该类型必须实现 IBinarySerialize 接口。

    • 该类型必须指定 MaxByteSize 的值。

  • MaxByteSize
    必选。 此类型实例的最大大小,以字节为单位。

  • IsFixedLength
    可选。 指定该类型的所有实例长度是否相同。 默认值为 false。

  • IsByteOrdered
    可选。 指定该类型的二进制表示形式是否已排序,即是否可以使用它比较该类型的实例。 默认值为 false。

此示例指定用户定义的类型的 Format 为 SerializedDataWithMetadata,且 MaxByteSize 为 8000 字节。

<SqlUserDefinedType(Format.Native, MaxByteSize:=8000)>
Public Class SampleType

   '...
End Class
[SqlUserDefinedType(Format.Native, MaxByteSize=8000)]
public class SampleType
{
   //...
}

请参见

任务

如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目

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

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

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

如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的函数

如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的类型

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

如何:调试 SQL CLR 存储过程

概念

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

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