CLR 統合のカスタム属性の概要

.NET Framework の CLR (共通言語ランタイム) では、属性という説明用のキーワードを使用できます。これらの属性は、メソッドやクラスなどの多くの要素に関する追加情報を提供します。属性はオブジェクトのメタデータと共にアセンブリに保存され、記述したコードを他の開発ツールに説明したり、SQL Server 内部での実行時の動作に影響することを説明するために使用できます。

CLR ルーチンを SQL Server に登録すると、そのルーチンに関する一連のプロパティが SQL Server により抽出されます。これらのプロパティによって、ルーチンにインデックスを作成できるかどうかなど、そのルーチンの機能が決まります。たとえば、DataAccess プロパティを DataAccessKind.Read に設定すると、CLR 関数内から SQL Server ユーザー テーブルのデータにアクセスできるようになります。次の例は、table1 というユーザー テーブルのデータにアクセスできるように DataAccess プロパティを設定する単純なケースを示しています。

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 System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports 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 Function
End Class

Transact-SQL ルーチンの場合は、SQL Server により、ルーチン定義から直接ルーチンのプロパティが抽出されます。CLR ルーチンの場合は、これらのプロパティを抽出するときに、サーバーでルーチン本体が分析されません。.NET Framework 言語で実装されているクラスとクラスのメンバには、カスタム属性を使用できます。

CLR ルーチン、ユーザー定義型、およびユーザー定義集計に必要なカスタム属性は、Microsoft.SqlServer.Server 名前空間で定義します。