Übersicht über benutzerdefinierte Attribute der CLR-Integration

Die CLR-Komponente (Common Language Runtime) von .NET Framework ermöglicht den Einsatz beschreibender Schlüsselwörter, so genannter Attribute. Diese Attribute stellen weitere Informationen für viele Elemente bereit, z. B. Methoden und Klassen. Die Attribute werden mit den Metadaten des Objekts in der Assembly gespeichert. Mit Attributen kann Code für andere Entwicklungstools beschrieben oder das Laufzeitverhalten in SQL Server beeinflusst werden.

Wenn Sie eine CLR-Routine bei SQL Server registrieren, leitet SQL Server einen Satz von Eigenschaften zu der Routine ab. Diese Routineneigenschaften bestimmen die Fähigkeiten der Routine, darunter auch, ob die Routine indiziert werden kann. Durch Festlegen von DataAccessKind.Read für die DataAccess-Eigenschaft können Sie beispielsweise innerhalb einer CLR-Funktion auf Daten aus SQL Server-Benutzertabellen zugreifen. Im folgenden Beispiel wird ein einfacher Fall gezeigt, in dem der Datenzugriff aus einer table1-Benutzertabelle durch Festlegen der DataAccess-Eigenschaft vereinfacht wird.

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

Für Transact-SQL-Routinen leitet SQL Server Routineneigenschaften direkt aus der Routinendefinition ab. Für CLR-Routinen analysiert der Server den Routinentext nicht, um diese Eigenschaften abzuleiten. Stattdessen können Sie benutzerdefinierte Attribute für Klassen und Klassenmember verwenden, die in einer .NET Framework-Sprache implementiert wurden.

Die für CLR-Routinen benötigten benutzerdefinierten Attribute, benutzerdefinierte Typen und Aggregate werden im Microsoft.SqlServer.Server-Namespace definiert.