MSSQLSERVER_6522

Van toepassing op:SQL Server

Details

Attribute Value
Productnaam SQL Server
Gebeurtenis-id 6522
Bron van gebeurtenis MSSQLSERVER
Onderdeel SQLEngine
Symbolische naam SQLCLR_UDF_EXEC_FAILED
Berichttekst Een fout in .NET Framework deed zich voor tijdens de uitvoering van door de gebruiker gedefinieerde routine of aggregate "%.*ls": %ls.

Explanation

Houd rekening met de volgende scenario's.

Scenario 1

Je maakt een common language runtime (CLR) routine die verwijst naar een Microsoft .NET Framework-assembly. De .NET Framework-assemblee is niet gedocumenteerd in 922672. Vervolgens installeer je de .NET Framework 3.5 of een hotfix gebaseerd op .NET Framework 2.0.

Scenario 2

Je maakt een assembly aan en registreert die assembly vervolgens in een SQL Server-database. Vervolgens installeer je een andere versie van de assembly in de Global Assembly Cache (GAC).

Wanneer je de CLR-routine uitvoert of de assembly uit een van deze scenario's gebruikt in SQL Server, krijg je een foutmelding die lijkt op het volgende:

Server: Msg 6522, Niveau 16, Staat 2, Lijn 1
Er trad een fout in .NET Framework op tijdens de uitvoering van een door de gebruiker gedefinieerde routine of geaggregeerde 'getsid':

System.IO.FileLoadException: Kon bestand of assembly niet laden 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' of een van de afhankelijkheden. Assembly in de hoststore heeft een andere handtekening dan assembly in GAC. (Uitzondering op HRESULT: 0x80131050)

Mogelijke oorzaak

Wanneer de CLR een assembly laadt, verifieert de CLR dat dezelfde assembly in de GAC zit. Als dezelfde assembly in de GAC zit, verifieert de CLR of de Module Version ID's (MVID's) van deze assemblies overeenkomen. Als de MVID's van deze assemblies niet overeenkomen, ontvang je het foutbericht dat in het Uitleggedeelte wordt genoemd.

Wanneer een assembly opnieuw wordt gecompileerd, verandert de MVID van de assembly. Daarom, als je het .NET Framework bijwerkt, hebben de assemblies van het .NET Framework verschillende MVID's omdat die assemblies opnieuw worden gecompileerd. Bovendien, als je je eigen assembly bijwerkt, wordt de assembly opnieuw gecompileerd. Daarom heeft de vergadering ook een andere MVID.

Gebruikersactie

Actie 1

Om scenario 1 in de Uitleg-sectie te omzeilen, moet je handmatig de .NET Framework-assemblies updaten in SQL Server. Om dit te doen, gebruik je de ALTER ASSEMBLY instructie om te wijzen naar de nieuwe versie van de .NET Framework-assembly in de volgende map:

%Windir%\Microsoft.NET\Framework\Version

Note

De versie vertegenwoordigt de versie van het .NET Framework die je hebt geïnstalleerd of bijgewerkt.

Actie 2

Om scenario 2 in de Uitleg-sectie te omzeilen, gebruik je de ALTER ASSEMBLY instructie om de assembly in de database bij te werken.

Als het probleem nog steeds bestaat nadat je dit hebt gedaan, verwijder dan de assembly uit de database en registreer vervolgens de nieuwe versie van de assembly in de database.

Meer informatie

Wij raden niet aan om .NET Framework-assemblies te gebruiken die niet in het Support-beleid zijn gedocumenteerd voor ongeteste .NET Framework-assemblies in de door SQL Server CLR gehoste omgeving. Het geeft een lijst van de assemblies die zijn getest in de door SQL Server CLR gehoste omgeving.

Beschrijving van CLR-routines

CLR-routines omvatten de volgende objecten die worden geïmplementeerd door gebruik te maken van SQL Server-integratie met de .NET Framework CLR:

  • Scalair-waarde, door gebruikers gedefinieerde functies (scalair UDF's)
  • Tabelwaarde-gebruikersgedefinieerde functies (TVF's)
  • Door de gebruiker gedefinieerde procedures (UDP's)
  • Door de gebruiker gedefinieerde triggers
  • Door de gebruiker gedefinieerde gegevenstypen
  • Door de gebruiker gedefinieerde aggregaties

Assemblies die worden bijgewerkt nadat je de .NET Framework 3.5 hebt geïnstalleerd

Nadat je de .NET Framework 3.5 hebt geïnstalleerd, moet je de ALTER ASSEMBLY instructie gebruiken om de volgende assemblies bij te werken:

  • 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

Deze assemblies bevinden zich in de volgende map:

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

Hoe bewaar je de data van door de gebruiker gedefinieerde datatypes nadat je een assembly hebt verwijderd

Als je een assembly verwijdert die een door de gebruiker gedefinieerd datatype van SQL Server gebruikt, kun je een van de volgende methoden gebruiken om de data te behouden.

Stel dat het volgende scenario is:

  • Je maakt een assembly aan waarvan de naam MyAssembly.dllis.
  • De MyAssembly-assembly verwijst naar de System.DirectoryServices.dll assembly.
  • Je hebt een door de gebruiker gedefinieerd datatype met de naam MyDateTime.
  • Het MyDateTime-datatype gebruikt de MyAssembly.dll assembly.
  • Je maakt een tabel aan met de naam MyTable.
  • De MyTable-tabel bevat de gegevens van het MyDateTime-datatype .

Methode 1: Gebruik de bcp.exe hulpdienst

  1. Gebruik de Bcp.exe-utility samen met de -n switch om de data van de MyTable-tabel naar een bestand te kopiëren. Voer bijvoorbeeld het volgende commando uit bij een opdrachtprompt:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. Volg in SQL Server Management Studio deze stappen:

    1. Laat de MyTable-tafel vallen.
    2. Laat het MyDateTime-datatype vallen.
    3. Laat de System.DirectoryServices.dll vergadering vallen.
    4. Laat de MyAssembly-assembly vallen.
  3. Volg in SQL Server Management Studio deze stappen:

    1. Registreer de System.DirectoryServices.dll vergadering.
    2. Registreer de MyAssembly-assembly.
    3. Maak het Datatype MyDateTime aan.
    4. Maak een nieuwe tabel aan die dezelfde tabelstructuur heeft als de MyTable-tabel.
  4. Gebruik de Bcp.exe-tool samen met de -n switch om de gegevens uit het bestand te importeren in de MyTable-tabel. Voer bijvoorbeeld het volgende commando uit bij een opdrachtprompt:

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

Methode 2: Gebruik de INSERT ... SELECT-verklaring

Stel dat het MyDateTime-datatype 9 bytes in opslag belegt.

  1. In SQL Server Management Studio maakt u een nieuwe tabel aan die een kolom van het VARBINARY(9) datatype bevat door de volgende instructie uit te voeren:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Voer het volgende INSERT uit ... SELECT-instructie om de TempTable-tabel te vullen:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. Volg in SQL Server Management Studio deze stappen:

    1. Laat de MyTable-tafel vallen.
    2. Laat het MyDateTime-datatype vallen.
    3. Laat de System.DirectoryServices.dll assemblage vallen.
    4. Laat de MyAssembly-assembly vallen.
  4. Volg in SQL Server Management Studio deze stappen:

    1. Registreer de System.DirectoryServices.dll vergadering.
    2. Registreer de MyAssembly-assembly.
    3. Maak het Datatype MyDateTime aan.
    4. Maak een nieuwe tabel aan die dezelfde tabelstructuur heeft als de MyTable-tabel.
  5. Voer het volgende INSERT uit ... SELECT-instructie om de MyTable-tabel te vullen:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

References