Атрибуты проектов баз данных SQL в среде CLR и объектов баз данных

К каждому проекту SQL Server и ко всем его объектам должен быть применен атрибут. Интеграцию SQL Server со средой CLR (SQL CLR) можно использовать для создания объектов следующих типов:

Проект / Файл

Атрибут, который должен быть применен

Проект

SqlAssemblyAttribute

Aggregate

SqlUserDefinedAggregateAttribute

Хранимая процедура

SqlProcedureAttribute

Trigger

SqlTriggerAttribute

Пользовательская функция.

SqlFunctionAttribute

Пользовательский тип данных.

SqlUserDefinedTypeAttribute

Атрибут SqlAssembly.

Этот атрибут должен применяться ко всем сборкам, которые будут развернуты в базе данных SQL Server. Этот атрибут не имеет параметров. Он добавляется в файл AssemblyInfo при создании проекта SQL Server.

SqlUserDefinedAggregate Attribute

Этот атрибут должен применяться к пользовательским агрегатным объектам. Этот атрибут имеет два свойства: FormatandMaxByteSize.

  • Format
    Обязательный. Формат хранения агрегатной функции. Ниже приведены поддерживаемые форматы.

    Native — указывает, что SQL Server использует эффективное представление в машинном коде на диске. Этот формат является наиболее компактным и обеспечивает максимальную производительность. Требования для этого формата таковы:

    • Атрибут StructLayout.LayoutKindSequential должен быть применен к агрегатной функции.

    • Все поля агрегатной функции должны быть непреобразуемыми, т. е. они должны иметь общее представление в управляемой и в неуправляемой памяти и не требовать специальной обработки маршаллером взаимодействия.

    • Статистическая функция не должна определять значение для MaxByteSize.

    • Статистическая функция не должна иметь полей [NonSerialized].

    • Поля не должны быть помечены как явный макет.

    UserDefined — указывает, что пользователь имеет полный контроль над двоичным форматом. Требования для этого формата таковы:

    • Статистическая функция должна реализовывать IBinarySerialize.

    • Статистическая функция должна определять значение для MaxByteSize.

  • MaxByteSize
    Максимальный размер экземпляра этой агрегатной функции в байтах. Требуется, только если для свойства UserDefined задано значение Format. Не требуется указывать, если для свойства Native задано значение Format.

Этот пример указывает, что для свойства Native значением является Format агрегата.

<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 — обязательный. Указывает целевой объект, к которому применяется этот триггер. Тип целевого объекта зависит от типа создаваемого целевого объекта. Можно создавать триггеры DML, DDL или LOGON. Наиболее распространенный тип триггера применяется к таблицам.

  • Event — обязательный. Указывает действие, которое активирует триггер.

В этом примере триггер активируется путем обновления существующих данных (UPDATE) в таблице authors.

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. Триггер активизирован путем добавления новых данных (INSERT) в таблицу publishers.

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 со средой CLR

Практическое руководство. Создание и запуск хранимой процедуры SQL Server при помощи интеграции со средой CLR

Практическое руководство. Создание и запуск триггера SQL Server при помощи интеграции со средой CLR

Практическое руководство. Создание и запуск статистического выражения SQL Server при помощи интеграции со средой CLR

Практическое руководство. Создание и запуск пользовательской функции SQL Server при помощи интеграции со средой CLR

Практическое руководство. Создание и запуск пользовательского типа SQL Server при помощи интеграции со средой CLR

Пошаговое руководство. Создание хранимой процедуры в управляемом коде

Практическое руководство. Отладка хранимой процедуры SQL CLR

Основные понятия

Введение в интеграцию SQL Server со средой CLR (ADO.NET)

Преимущества использования управляемого кода для создания объектов баз данных