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
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
Führen Sie in SQL Server Management Studio die folgenden Schritte aus:
- Löschen Sie die MyTable-Tabelle.
- Löschen Sie den MyDateTime-Datentyp.
- Löschen Sie die
System.DirectoryServices.dll
-Assembly. - Löschen Sie die MyAssembly-Assembly.
Führen Sie in SQL Server Management Studio die folgenden Schritte aus:
- Registrieren Sie die
System.DirectoryServices.dll
-Assembly. - Registrieren Sie die MyAssembly-Assembly.
- Erstellen Sie den MyDateTime-Datentyp.
- Erstellen Sie eine neue Tabelle, die die gleiche Tabellenstruktur wie die Tabelle „MyTable“ aufweist.
- Registrieren Sie die
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.
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));
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;
Führen Sie in SQL Server Management Studio die folgenden Schritte aus:
- Löschen Sie die MyTable-Tabelle.
- Löschen Sie den MyDateTime-Datentyp.
- Löschen Sie die Assembly „System.DirectoryServices.dll“.
- Löschen Sie die MyAssembly-Assembly.
Führen Sie in SQL Server Management Studio die folgenden Schritte aus:
- Registrieren Sie die Assembly „System.DirectoryServices.dll“.
- Registrieren Sie die MyAssembly-Assembly.
- Erstellen Sie den MyDateTime-Datentyp.
- Erstellen Sie eine neue Tabelle, die die gleiche Tabellenstruktur wie die Tabelle „MyTable“ aufweist.
Führen Sie die folgende EINFÜGE... SELECT-Anweisung zum Auffüllen der Tabelle "MyTable":
INSERT INTO MyTable SELECT c1 FROM TempTable;
References
- Weitere Informationen zur Assemblyversion finden Sie in der Dokumentation zu Visual Studio 2005 (veraltet).
- Weitere Informationen zum Aktualisieren einer Assembly finden Sie unter ALTER ASSEMBLY (Transact-SQL).
- Weitere Informationen zum Löschen einer Assembly finden Sie unter DROP ASSEMBLY (Transact-SQL).
- Weitere Informationen zum Registrieren einer Assembly in einer SQL Server-Datenbank finden Sie unter CREATE ASSEMBLY (Transact-SQL).
- Weitere Informationen zum Hilfsprogramm „Bcp.exe“ finden Sie unter https://msdn2.microsoft.com/library/ms162802.aspx.