MSSQLSERVER_6522

Si applica a: sìSQL Server (tutte le versioni supportate)

Dettagli

Attributo Valore
Nome prodotto SQL Server
ID evento 6522
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico SQLCLR_UDF_EXEC_FAILED
Testo del messaggio Errore di .NET Framework durante l'esecuzione dell'aggregazione o routine definita dall'utente "%.*ls": %ls.

Spiegazione

Esaminare gli scenari seguenti:

Scenario 1

Si crea una routine Common Language Runtime (CLR) che fa riferimento a un assembly Microsoft .NET Framework. L'assembly .NET Framework non è documentato in 922672. Successivamente si installa .NET Framework 3.5 o un hotfix basato su .NET Framework 2.0.

Scenario 2

Si crea un assembly e quindi si registra l'assembly in un database SQL Server. Successivamente si installa una versione diversa dell'assembly nella GAC (Global Assembly Cache).

Quando si esegue la routine CLR o si usa l'assembly da uno di questi scenari in SQL Server, viene visualizzato un messaggio di errore simile al seguente:

Server: Messaggio 6522, livello 16, stato 2, riga 1
Errore di .NET Framework durante l'esecuzione dell'aggregazione o routine definita dall'utente ‘getsid’:

System.IO.FileLoadException: Impossibile caricare il file o l'assembly 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' o una delle relative dipendenze. L'assembly nell'archivio host ha una firma diversa dall'assembly nella GAC. (Eccezione da HRESULT: 0x80131050)

Possibile causa

Quando CLR carica un assembly, verifica che lo stesso assembly si trovi nella GAC. Se nella GAC è presente lo stesso assembly, CLR verifica che gli ID della versione del modulo (MVID) di questi assembly corrispondano. Se i MVID degli assembly non corrispondono, viene visualizzato il messaggio di errore menzionato nella sezione Spiegazione.

Quando un assembly viene ricompilato, il MVID dell'assembly cambia. Di conseguenza, se si aggiorna .NET Framework, gli assembly .NET Framework hanno MVID diversi perché tali assembly vengono ricompilati. Inoltre, se si aggiorna un assembly personalizzato, l'assembly viene ricompilato. Per questo motivo l'assembly ha anche un MVID diverso.

Azione utente

Azione 1

Per trovare un soluzione per lo scenario 1 nella sezione Spiegazione, è necessario aggiornare manualmente gli assembly .NET Framework in SQL Server. Per eseguire questa operazione, usare l'istruzione ALTER ASSEMBLY per puntare alla nuova versione dell'assembly .NET Framework nella cartella seguente:

%Windir%\Microsoft.NET\Framework\Version

Nota

Version rappresenta la versione di .NET Framework installata o aggiornata.

Azione 2

Per trovare una soluzione per lo scenario 2 nella sezione Spiegazione, usare l'istruzione ALTER ASSEMBLY per aggiornare l'assembly nel database.

Se il problema persiste dopo aver eseguito questa operazione, eliminare l'assembly dal database, quindi registrare la nuova versione dell'assembly nel database.

Ulteriori informazioni

Non è consigliabile usare assembly .NET Framework che non sono documentati nei criteri di supporto per gli assembly .NET Framework non testati nell'ambiente ospitato nell’oggetto CLR di SQL Server. Sono elencati gli assembly testati nell'ambiente SQL Server ospitato in CLR.

Descrizione delle routine CLR

Le routine CLR includono gli oggetti seguenti, implementati usando l'integrazione di SQL Server con il supporto CLR di .NET Framework:

  • Funzioni definite dall'utente con valori scalari
  • Funzioni definite dall'utente con valori di tabella
  • Procedure definite dall'utente
  • Trigger definiti dall'utente
  • Tipi di dati definiti dall'utente
  • Funzioni di aggregazione definite dall'utente

Assembly da aggiornare dopo l'installazione di .NET Framework 3.5

Dopo aver installato .NET Framework 3.5 è necessario usare l'istruzione ALTER ASSEMBLY per aggiornare gli assembly seguenti:

  • 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

Questi assembly si trovano nella cartella seguente:

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

Come mantenere i dati da tipi di dati definiti dall'utente dopo l'eliminazione di un assembly

Se si elimina un assembly usato da un tipo di dati definito dall'utente in SQL Server, è possibile usare uno dei metodi seguenti per conservare i dati.

Si supponga che lo scenario sia il seguente:

  • Si crea un assembly il cui nome è MyAssembly.dll.
  • L'assembly MyAssembly fa riferimento all'assembly System.DirectoryServices.dll.
  • Si ha un tipo di dati definito dall'utente il cui nome è MyDateTime.
  • Il tipo di dati MyDateTime usa l'assembly MyAssembly.dll.
  • Si crea una tabella denominata MyTable.
  • La tabella MyTable contiene i dati del tipo di dati MyDateTime.

Metodo 1: Usare l'utilità Bcp.exe

  1. Usare l'utilità Bcp.exe insieme all'opzione -n per copiare i dati dalla tabella MyTable in un file. Ad esempio, eseguire questo comando a un prompt dei comandi:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. In SQL Server Management Studio seguire questa procedura:

    1. Eliminare la tabella MyTable.
    2. Eliminare il tipo di dati MyDateTime.
    3. Eliminare l’assembly System.DirectoryServices.dll.
    4. Eliminare l'assembly MyAssembly.
  3. In SQL Server Management Studio seguire questa procedura:

    1. Registrare l'assembly System.DirectoryServices.dll.
    2. Registrare l'assembly MyAssembly.
    3. Creare il tipo di dati MyDateTime.
    4. Creare una nuova tabella con la stessa struttura della tabella MyTable.
  4. Usare l'utilità Bcp.exe insieme all'opzione -n per importare i dati dal file nella tabella MyTable. Ad esempio, eseguire questo comando a un prompt dei comandi:

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

Metodo 2: Usare INSERT ... Istruzione SELECT

Si supponga che il tipo di dati MyDateTime occupi 9 byte nella risorsa di archiviazione.

  1. In SQL Server Management Studio creare una nuova tabella contenente una colonna del tipo di dati VARBINARY(9) eseguendo l'istruzione seguente:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Eseguire la seguente istruzione INSERT ... SELECT per popolare la tabella TempTable:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. In SQL Server Management Studio seguire questa procedura:

    1. Eliminare la tabella MyTable.
    2. Eliminare il tipo di dati MyDateTime.
    3. Eliminare l’assembly System.DirectoryServices.dll.
    4. Eliminare l'assembly MyAssembly.
  4. In SQL Server Management Studio seguire questa procedura:

    1. Registrare l’assembly System.DirectoryServices.dll.
    2. Registrare l'assembly MyAssembly.
    3. Creare il tipo di dati MyDateTime.
    4. Creare una nuova tabella con la stessa struttura della tabella MyTable.
  5. Eseguire la seguente istruzione INSERT ... SELECT per popolare la tabella MyTable:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

Riferimenti