Общие сведения о пользовательских атрибутах интеграции со средой CLR

В среде CLR .NET Framework допускается использование описательных ключевых слов, именуемых атрибутами. Эти атрибуты содержат дополнительную информацию по многим элементам, таким, как методы и классы. Эти атрибуты сохраняются в сборке с метаданными объекта и могут быть использованы для описания кода другим инструментальным средствам разработки или для изменения поведения на этапе выполнения внутри SQL Server.

При регистрации подпрограммы в SQL Server SQL Server получает набор свойств этой подпрограммы. Эти свойства подпрограммы определяют возможности подпрограммы и в частности указывают на то, может ли она быть индексирована. Так, если свойству DataAccess задается значение DataAccessKind.Read, тем самым открывается возможность обращения к данным из пользовательских таблиц SQL Server внутри функции CLR. Следующий пример демонстрирует простую ситуацию, в которой задается значение свойства DataAccess для облегчения доступа к данным из пользовательской таблицы table1.

using System;using System.Data;using System.Data.Sql;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;using System.Data.SqlClient;public partial class UserDefinedFunctions{    [SqlFunction(DataAccess = DataAccessKind.Read)]    public static string func1()    {        // Open a connection and create a command        SqlConnection conn = new SqlConnection("context connection = true");        conn.Open();        SqlCommand cmd = conn.CreateCommand();        cmd.CommandText = "SELECT str_val FROM table1 WHERE int_val = 10";        // where table1 is a user table        // Execute this command         SqlDataReader rd = cmd.ExecuteReader();        // Set string ret_val to str_val returned from the query        string ret_val = rd.GetValue(0).ToString();        rd.Close();        return ret_val;    }}
Imports SystemImports System.DataImports System.Data.SqlImports System.Data.SqlTypesImports Microsoft.SqlServer.ServerImports System.Data.SqlClient Public partial Class UserDefinedFunctions    <SqlFunction(DataAccess = DataAccessKind.Read)> _     Public Shared Function func1() As String        ' Open a connection and create a command        Dim conn As SqlConnection = New SqlConnection("context connection = true")         conn.Open()        Dim cmd As SqlCommand =  conn.CreateCommand()         cmd.CommandText = "SELECT str_val FROM table1 WHERE int_val = 10"        ' where table1 is a user table        ' Execute this command         Dim rd As SqlDataReader =  cmd.ExecuteReader()         ' Set string ret_val to str_val returned from the query        Dim ret_val As String =  rd.GetValue(0).ToString()         rd.Close()        Return ret_val    End FunctionEnd Class

Что же касается подпрограмм Transact-SQL, SQL Server получает свойства подпрограмм непосредственно из их определений. Сервер не анализирует тексты подпрограмм CLR для получения этих свойств. Вместо этого можно использовать пользовательские атрибуты для классов и членов классов, реализованных в языке .NET Framework.

Пользовательские атрибуты, необходимые для подпрограмм CLR, пользовательских типов и агрегатов, определяются в пространстве имен Microsoft.SqlServer.Server.