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
Betrachten Sie folgende Szenarien:
Szenario 1
Sie erstellen eine Common Language Runtime (CLR)-Routine, 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 diese dann 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 der folgenden ähnelt:
Server: Meldung 6522, Ebene 16, Status 2, Zeile 1
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats „getsid“:System.IO.FileLoadException: Die Datei oder Assembly „System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a“ oder eine Abhängigkeit davon wurde nicht gefunden. 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.
Benutzeraktion
Aktion 1
Um Szenario 1 im Abschnitt Erklärung zu umgehen, müssen Sie die .NET Framework-Assemblys in SQL Server 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. In dieser sind die Assemblys aufgelistet, die in der von der SQL Server-CLR gehosteten Umgebung getestet wurden.
Beschreibung von CLR-Routinen
CLR-Routinen enthalten die folgenden Objekte, die mithilfe der SQL Server-Integration in die .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 Assemblies 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 löschen, die von einem benutzerdefinierten SQL Server-Datentyp verwendet wird, 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 der 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 Datentyps
VARBINARY(9)
enthält, indem Sie die folgende Anweisung ausführen:CREATE TABLE TempTable (c1 VARBINARY(9));
Führen Sie die folgende INSERT ... SELECT-Anweisung aus, um die TempTable-Tabelle aufzufüllen:
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 INSERT ... SELECT-Anweisung aus, um die MyTable-Tabelle aufzufüllen:
INSERT INTO MyTable SELECT c1 FROM TempTable;
Referenzen
- 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.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für