Ü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.