MSSQLSERVER_6522
S’applique à : SQL Server
Détails
Attribut | Valeur |
---|---|
Nom du produit | SQL Server |
ID de l’événement | 6522 |
Source de l’événement | MSSQLSERVER |
Composant | SQLEngine |
Nom symbolique | SQLCLR_UDF_EXEC_FAILED |
Texte du message | Une erreur .NET Framework s’est produite au cours de l’exécution de la routine ou de la fonction d’agrégation définie par l’utilisateur "%.*ls" : %ls. |
Explication
Examinez les scénarios suivants.
Scénario 1
Vous créez une routine de Common Language Runtime (CLR) qui fait référence à un assembly Microsoft .NET Framework. L’assembly .NET Framework n’est pas documenté dans 922672. Ensuite, vous installez le .NET Framework 3.5 ou un correctif logiciel basé sur .NET Framework 2.0.
Scénario 2
Vous créez un assembly, puis vous inscrivez l’assembly dans une base de données SQL Server. Ensuite, vous installez une autre version de l’assembly dans le Global Assembly Cache (GAC).
Lorsque vous exécutez la routine CLR ou utilisez l’assembly à partir de l’un de ces scénarios dans SQL Server, vous recevez un message d’erreur semblable à ce qui suit :
Serveur : Msg 6522, Niveau 16, État 2, Ligne 1
Une erreur .NET Framework s’est produite au cours de l’exécution de la routine ou de la fonction d’agrégation définie par l’utilisateur 'getsid’ :System.IO.FileLoadException : Impossible de charger le fichier ou l’assembly « System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a » ou l’une de ses dépendances. L’assembly dans le magasin hôte a une signature différente de celle de l’assembly dans le GAC. (Exception de HRESULT : 0x80131050)
Cause possible
Lorsque le CLR charge un assembly, il vérifie que le même assembly se trouve dans le GAC. Si le même assembly se trouve dans le GAC, le CLR vérifie que les ID de version de module (MVID) de ces assemblys correspondent. Si les MVID de ces assemblys ne correspondent pas, vous recevez le message d’erreur que la section Explication mentionne.
Lorsqu’un assembly est recompilé, le MVID de l’assembly change. Par conséquent, si vous mettez à jour le .NET Framework, les assemblys .NET Framework ont des MVID différents, car ces assemblys sont recompilés. En outre, si vous mettez à jour votre propre assembly, l’assembly est recompilé. Par conséquent, l’assembly a également un MVID différent.
Action utilisateur
Action 1
Pour contourner le scénario 1 dans la section Explication , vous devez mettre à jour manuellement les assemblys .NET Framework dans SQL Server. Pour ce faire, utilisez l’instruction ALTER ASSEMBLY
pour pointer vers la nouvelle version de l’assembly .NET Framework dans le dossier suivant :
%Windir%\Microsoft.NET\Framework\Version
Remarque
Version représente la version de .NET Framework que vous avez installée ou mise à jour.
Action 2
Pour contourner le scénario 2 de la section Explication, utilisez l’instruction ALTER ASSEMBLY
pour mettre à jour l’assembly dans la base de données.
Si le problème persiste, supprimez l’assembly de la base de données, puis enregistrez la nouvelle version de l’assembly dans la base de données.
Plus d’informations
Nous vous déconseillons d’utiliser des assemblys .NET Framework qui ne sont pas documentés dans Stratégie de prise en charge des assemblys .NET Framework non testés dans l’environnement SQL Server hébergé par le CLR. Il répertorie les assemblys testés dans l’environnement hébergé par LE CLR SQL Server.
Description des routines CLR
Les routines CLR incluent les objets suivants implémentés à l’aide de l’intégration de SQL Server au CLR .NET Framework :
- Fonctions scalaires définies par l'utilisateur (fonctions UDF scalaires)
- Fonctions table définies par l'utilisateur (TVF)
- Procédures définies par l'utilisateur (UDP)
- Déclencheurs définis par l’utilisateur
- Types de données définis par l’utilisateur
- Fonctions d'agrégation définies par l'utilisateur
Assemblys à mettre à jour après l’installation de .NET Framework 3.5
Après avoir installé .NET Framework 3.5, vous devez utiliser l’instruction ALTER ASSEMBLY pour mettre à jour les assemblys suivants :
- 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
Ces assemblys se trouvent dans le dossier suivant :
%Windir%\Microsoft.NET\Framework\v2.0.50727
Comment conserver les données des types de données définis par l’utilisateur après la suppression d’un assembly
Si vous supprimez un assembly utilisé par un type de données défini par l’utilisateur à partir de SQL Server, vous pouvez utiliser l’une des méthodes suivantes pour conserver les données.
Supposons le scénario suivant :
- Vous créez un assembly dont le nom est MyAssembly.dll.
- L’assembly MyAssembly référence l’assembly
System.DirectoryServices.dll
. - Vous avez un type de données défini par l’utilisateur dont le nom est MyDateTime.
- Le type de données MyDateTime utilise l’assembly MyAssembly.dll.
- Vous créez une table dont le nom est MyTable.
- La table MyTable contient des données du type de données MyDateTime.
Méthode 1 : Utiliser l’utilitaire bcp.exe
Utilisez l’utilitaire bcp.exe conjointement avec l’option -n pour copier les données de la table MyTable dans un fichier. Par exemple, exécutez la commande suivante à partir d’une invite de commandes :
bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
Dans SQL Server Management Studio, procédez comme suit :
- Supprimez la table MyTable.
- Supprimez le type de données MyDateTime.
- Supprimez l’assembly
System.DirectoryServices.dll
. - Supprimez l’assembly MyAssembly.
Dans SQL Server Management Studio, procédez comme suit :
- Inscrire l’assembly
System.DirectoryServices.dll
. - Inscrivez l’assembly MyAssembly.
- Créez le type de données MyDateTime.
- Créez une table qui a la même structure de table que la table MyTable.
- Inscrire l’assembly
Utilisez l’utilitaire bcp.exe conjointement avec l’option -n pour importer les données du fichier dans la table MyTable. Par exemple, exécutez la commande suivante à partir d’une invite de commandes :
bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
Méthode 2 : Utiliser l’insert ... INSTRUCTION SELECT
Supposons que le type de données MyDateTime occupe 9 octets dans le stockage.
Dans SQL Server Management Studio, créez une table qui contient une colonne du
VARBINARY(9)
type de données en exécutant l’instruction suivante :CREATE TABLE TempTable (c1 VARBINARY(9));
Exécutez l’instruction INSERT suivante ... Instruction SELECT pour remplir la table TempTable :
INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
Dans SQL Server Management Studio, procédez comme suit :
- Supprimez la table MyTable.
- Supprimez le type de données MyDateTime.
- Supprimez l’assembly System.DirectoryServices.dll.
- Supprimez l’assembly MyAssembly.
Dans SQL Server Management Studio, procédez comme suit :
- Inscrivez l’assembly System.DirectoryServices.dll.
- Inscrivez l’assembly MyAssembly.
- Créez le type de données MyDateTime.
- Créez une table qui a la même structure de table que la table MyTable.
Exécutez l’instruction INSERT suivante ... Instruction SELECT pour remplir la table MyTable :
INSERT INTO MyTable SELECT c1 FROM TempTable;
Références
- Pour plus d’informations sur la version de l’assembly, consultez la Documentation de Visual Studio 2005 retirée.
- Pour plus d’informations sur la mise à jour d’un assembly, consultez ALTER ASSEMBLY (Transact-SQL).
- Pour plus d’informations sur la suppression d’un assembly, consultez DROP ASSEMBLY (Transact-SQL).
- Pour plus d’informations sur l’inscription d’un assembly dans une base de données SQL Server, consultez CREATE ASSEMBLY (Transact-SQL).
- Pour plus d’informations sur l’utilitaire bcp.exe, consultez https://msdn2.microsoft.com/library/ms162802.aspx.