MSSQLSERVER_6522

Gilt für: SQL Server

Details

attribute Wert
Produktname SQL Server
Ereignis-ID 6522
Ereignisquelle MSSQLSERVER
Komponente SQLEngine
Symbolischer Name SQLCLR_UDF_EXEC_FAILED
Meldungstext .NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats „%.*ls“: %ls.

Erklärung

Stellen Sie sich die folgenden Szenarien vor.

Szenario 1

Sie erstellen eine CLR-Routine (Common Language Runtime), die auf eine Microsoft .NET Framework-Assembly verweist. Die .NET Framework-Assembly ist in 922672nicht dokumentiert. Anschließend installieren Sie den .NET Framework 3.5- oder einen .NET Framework 2.0-basierten Hotfix.

Szenario 2

Sie erstellen eine Assembly und registrieren dann die Assembly in einer SQL Server-Datenbank. Anschließend installieren Sie eine andere Version der Assembly im globalen Assemblycache (GAC).

Wenn Sie die CLR-Routine ausführen oder die Assembly aus einem dieser Szenarien in SQL Server verwenden, erhalten Sie eine Fehlermeldung, die wie folgt aussieht:

Server: Msg 6522, Level 16, State 2, Line 1
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats „getsid“:

System.IO.FileLoadException: Datei oder Assembly 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Assembly im Hostspeicher weist eine andere Signatur als die Assembly im GAC auf. (Ausnahme von HRESULT: 0x80131050)

Mögliche Ursache

Wenn die CLR eine Assembly lädt, prüft sie, ob sich die gleiche Assembly im GAC befindet. Wenn sich die gleiche Assembly im GAC befindet, überprüft die CLR, ob die Modulversions-IDs (MVIDs) dieser Assemblys übereinstimmen. Wenn die MVIDs dieser Assemblys nicht übereinstimmen, erhalten Sie die Fehlermeldung, die im Abschnitt Erklärung erwähnt wird.

Wird eine Assembly neu kompiliert, ändert sich die MVID der Assembly. Wenn Sie also .NET Framework aktualisieren, weisen die .NET Framework-Assemblys andere MVIDs auf, da diese Assemblys neu kompiliert werden. Auch wenn Sie Ihre eigene Assembly aktualisieren, wird sie neu kompiliert. Daher weist die Assembly ebenfalls eine andere MVID auf.

Aktion des Benutzers

Aktion 1

Um Szenario 1 im Abschnitt "Erklärung " zu umgehen, müssen Sie die .NET Framework-Assemblys in SQL Server manuell aktualisieren. Verwenden Sie hierzu die ALTER ASSEMBLY-Anweisung, um auf die neue Version der .NET Framework Assembly im folgenden Ordner zu verweisen:

%Windir%\Microsoft.NET\Framework\Version

Hinweis

Version gibt die .NET Framework-Version an, die Sie installiert oder aktualisiert haben.

Aktion 2

Um Szenario 2 im Abschnitt Erklärung zu umgehen, verwenden Sie die ALTER ASSEMBLY-Anweisung, um die Assembly in der Datenbank zu aktualisieren.

Wenn das Problem auch nach dem Ausführen dieser Schritte fortbesteht, löschen Sie die Assembly aus der Datenbank, und registrieren Sie dann die neue Version der Assembly in der Datenbank.

Weitere Informationen

Es wird nicht empfohlen, .NET Framework-Assemblys zu verwenden, die nicht in der Supportrichtlinie für ungetestete .NET Framework-Assemblys in der von der SQL Server-CLR gehosteten Umgebung dokumentiert sind. Sie listet die Assemblys auf, die in der von SQL Server CLR gehosteten Umgebung getestet werden.

Beschreibung von CLR-Routinen

CLR-Routinen umfassen die folgenden Objekte, die mithilfe der SQL Server-Integration in .NET Framework CLR implementiert werden:

  • Benutzerdefinierte Skalarwertfunktionen (Skalar-UDFs)
  • Benutzerdefinierte Tabellenwertfunktionen (TVFs)
  • Benutzerdefinierte Prozeduren (UDPs)
  • Benutzerdefinierte Trigger
  • Benutzerdefinierte Datentypen
  • Benutzerdefinierte Aggregate

Assemblys, die nach der Installation von .NET Framework 3.5 aktualisiert werden sollen

Nachdem Sie .NET Framework 3.5 installiert haben, müssen Sie die Anweisung ALTER ASSEMBLY verwenden, um die folgenden Assemblys zu aktualisieren:

  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll

Diese Assemblys befinden sich im folgenden Ordner:

%Windir%\Microsoft.NET\Framework\v2.0.50727

Erhalten der Daten von benutzerdefinierten Datentypen nach dem Löschen einer Assembly

Wenn Sie eine Assembly ablegen, die ein benutzerdefinierter Datentyp aus SQL Server verwendet, können Sie eine der folgenden Methoden verwenden, um die Daten beizubehalten.

Angenommen, das Szenario sieht folgendermaßen aus:

  • Sie erstellen eine Assembly, deren Name MyAssembly.dll lautet.
  • Die Assembly „MyAssembly „ verweist auf die System.DirectoryServices.dll-Assembly.
  • Sie verfügen über einen benutzerdefinierten Datentyp mit dem Namen MyDateTime.
  • Der Datentyp MyDateTime verwendet die Assembly MyAssembly.dll.
  • Sie erstellen eine Tabelle mit dem Namen MyTable.
  • Die Tabelle MyTable enthält die Daten des Datentyps MyDateTime.

Methode 1: Verwenden des Hilfsprogramms bcp.exe

  1. Verwenden Sie das Hilfsprogramm „Bcp.exe“ zusammen mit dem Schalter „-n“, um die Daten aus der Tabelle „MyTable“ in eine Datei zu kopieren. Führen Sie an der Eingabeaufforderung beispielsweise den folgenden Befehl aus:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. Führen Sie in SQL Server Management Studio die folgenden Schritte aus:

    1. Löschen Sie die MyTable-Tabelle.
    2. Löschen Sie den MyDateTime-Datentyp.
    3. Löschen Sie die System.DirectoryServices.dll-Assembly.
    4. Löschen Sie die MyAssembly-Assembly.
  3. Führen Sie in SQL Server Management Studio die folgenden Schritte aus:

    1. Registrieren Sie die System.DirectoryServices.dll-Assembly.
    2. Registrieren Sie die MyAssembly-Assembly.
    3. Erstellen Sie den MyDateTime-Datentyp.
    4. Erstellen Sie eine neue Tabelle, die die gleiche Tabellenstruktur wie die Tabelle „MyTable“ aufweist.
  4. Verwenden Sie das Hilfsprogramm „Bcp.exe“ zusammen mit dem Schalter „-n“, um die Daten aus der Datei in die Tabelle „MyTable“ zu importieren. Führen Sie an der Eingabeaufforderung beispielsweise den folgenden Befehl aus:

    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
    

Methode 2: Verwenden Sie insert ... SELECT-Anweisung

Angenommen, der MyDateTime-Datentyp belegt 9 Byte im Speicher.

  1. Erstellen Sie in SQL Server Management Studio eine neue Tabelle, die eine Spalte des VARBINARY(9) Datentyps enthält, indem Sie die folgende Anweisung ausführen:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Führen Sie die folgende EINFÜGE... SELECT-Anweisung zum Auffüllen der TempTable-Tabelle:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. Führen Sie in SQL Server Management Studio die folgenden Schritte aus:

    1. Löschen Sie die MyTable-Tabelle.
    2. Löschen Sie den MyDateTime-Datentyp.
    3. Löschen Sie die Assembly „System.DirectoryServices.dll“.
    4. Löschen Sie die MyAssembly-Assembly.
  4. Führen Sie in SQL Server Management Studio die folgenden Schritte aus:

    1. Registrieren Sie die Assembly „System.DirectoryServices.dll“.
    2. Registrieren Sie die MyAssembly-Assembly.
    3. Erstellen Sie den MyDateTime-Datentyp.
    4. Erstellen Sie eine neue Tabelle, die die gleiche Tabellenstruktur wie die Tabelle „MyTable“ aufweist.
  5. Führen Sie die folgende EINFÜGE... SELECT-Anweisung zum Auffüllen der Tabelle "MyTable":

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

References