MSSQLSERVER_6522

platí pro:SQL Server

Podrobnosti

Attribute Value
Název produktu SQL Server
ID události 6522
Zdroj události MSSQLSERVER
Součást SQLEngine
Symbolický název SQLCLR_UDF_EXEC_FAILED
Text zprávy Při vykonání uživatelsky definované rutiny nebo agregátu došlo k chybě .NET Frameworku "%.*ls": %ls.

Explanation

Zvažte následující scénáře.

Scénář 1

Vytvoříte běžnou rutinu v běžném jazyce (CLR), která odkazuje na assembler Microsoft .NET Frameworku. Shromáždění .NET Framework není v 922672 zdokumentováno. Poté nainstalujete .NET Framework 3.5 nebo hotfix založený na .NET Framework 2.0.

Scénář 2

Vytvoříte assembler a pak ho zaregistrujete v databázi SQL Server. Poté nainstalujete jinou verzi assembleru do Global Assembly Cache (GAC).

Když spustíte CLR rutinu nebo použijete assembler z některého z těchto scénářů v SQL Server, obdržíte chybovou zprávu, která připomíná následující:

Server: Msg 6522, úroveň 16, stav 2, linka 1
Při spuštění uživatelsky definované rutiny nebo agregátu 'getsid' došlo k chybě .NET Frameworku:

System.IO.FileLoadException: Nebylo možné načíst soubor nebo assembler 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ani jednu z jeho závislostí. Assembler v hostitelském úložišti má jiný podpis než assembler v GAC. (Výjimka z HRESULT: 0x80131050)

Možná příčina

Když CLR načítá sestavu, ověřuje, že stejná sestava je v GAC. Pokud je stejný assembler v GAC, CLR ověřuje, že ID verzí modulů (MVID) těchto assemblerů odpovídají. Pokud se MVID těchto sestav neshodují, obdržíte chybovou zprávu, kterou zmiňuje sekce Vysvětlení .

Když je assembler znovu zkompilován, MVID assembleru se změní. Pokud tedy aktualizujete .NET Framework, .NET Framework assemblies mají jiné MVID, protože tyto assemblery jsou znovu kompilovány. Navíc, pokud aktualizujete vlastní assembler, assembler se znovu zkompiluje. Proto má shromáždění také odlišné MVID.

Akce uživatele

Akce 1

Pro obejít scénář 1 v sekci Vysvětlení musíte ručně aktualizovat assemblery .NET Frameworku v SQL Server. K tomu použijte příkaz, ALTER ASSEMBLY který odkazuje na novou verzi assembleru .NET Framework v následující složce:

%Windir%\Microsoft.NET\Framework\Version

Note

Verze představuje verzi .NET Frameworku, kterou jste nainstalovali nebo aktualizovali.

Akce 2

Pro obejít scénář 2 v sekci Vysvětlení použijte ALTER ASSEMBLY příkaz k aktualizaci assembleru v databázi.

Pokud problém přetrvává i po tomto ukázání, vyřaďte assembler z databáze a pak zaregistrujte novou verzi assembleru v databázi.

Více informací

Nedoporučujeme používat .NET Framework assemblery, které nejsou zdokumentovány v pravidlech podpory pro netestované assemblery .NET Frameworku v prostředí hostovaném na SQL Server CLR. Uvádí sestavy testované v prostředí hostovaném v SQL Server CLR.

Popis CLR rutin

CLR rutiny zahrnují následující objekty, které jsou implementovány pomocí integrace SQL Server s CLR .NET Framework:

  • Uživatelsky definované funkce s hodnotami skalárních hodnot (skalární UDF)
  • Tabulkově definované uživatelsky definované funkce (TVF)
  • Uživatelsky definované procedury (UDP)
  • Uživatelem definované spouštěče
  • Uživatelem definované datové typy
  • Uživatelem definované agregace

Assemblie, které se aktualizují po instalaci .NET Frameworku 3.5

Po instalaci .NET Frameworku 3.5 musíte použít ALTER ASSEMBLY příkaz k aktualizaci následujících assemblerů:

  • 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

Tyto sestavy jsou v následující složce:

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

Jak zachovat data z uživatelsky definovaných datových typů po vložení assembleru

Pokud odstraníte assembler, který používá uživatelsky definovaný datový typ ze SQL Server, můžete použít jednu z následujících metod k zachování dat.

Předpokládejme, že následující scénář je následující:

  • Vytvoříte shromáždění, jehož jméno jeMyAssembly.dll.
  • Shromáždění MyAssembly odkazuje na toto shromáždění System.DirectoryServices.dll .
  • Máte uživatelsky definovaný datový typ s názvem MyDateTime.
  • Datový typ MyDateTime používá MyAssembly.dll assembler.
  • Vytvoříte tabulku s názvem MyTable.
  • Tabulka MyTable obsahuje data datového typu MyDateTime .

Metoda 1: Použijte nástroj bcp.exe

  1. Použijte nástroj Bcp.exe spolu s přepínačem -n ke zkopírování dat z tabulky MyTable do souboru. Například spusť následující příkaz v příkazovém řádku:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. V SQL Server Management Studio postupujte podle těchto kroků:

    1. Zrušte tabulku MyTable.
    2. Vyřaďte datový typ MyDateTime.
    3. Zrušte System.DirectoryServices.dll ten soubor.
    4. Zrušte sestavení MyAssembly.
  3. V SQL Server Management Studio postupujte podle těchto kroků:

    1. Zaregistrujte shromáždění System.DirectoryServices.dll .
    2. Zaregistrujte shromáždění MyAssembly.
    3. Vytvořte datový typ MyDateTime.
    4. Vytvořte novou tabulku, která má stejnou strukturu tabulky jako tabulka MyTable.
  4. Použijte nástroj Bcp.exe spolu s přepínačem -n k importu dat ze souboru do tabulky MyTable. Například spusť následující příkaz v příkazovém řádku:

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

Metoda 2: Použijte ... INSERT Příkaz SELECT

Předpokládejme, že datový typ MyDateTime zabírá 9 bajtů v paměti.

  1. V SQL Server Management Studio vytvořte novou tabulku obsahující sloupec VARBINARY(9) datového typu spuštěním následujícího příkazu:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Vypusťte následující INSERT ... Příkaz SELECT pro vyplnění tabulky TempTable:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. V SQL Server Management Studio postupujte podle těchto kroků:

    1. Zrušte tabulku MyTable.
    2. Vyřaďte datový typ MyDateTime.
    3. Zrušte System.DirectoryServices.dll sestavu.
    4. Zrušte sestavení MyAssembly.
  4. V SQL Server Management Studio postupujte podle těchto kroků:

    1. Zaregistrujte System.DirectoryServices.dll sestavu.
    2. Zaregistrujte shromáždění MyAssembly.
    3. Vytvořte datový typ MyDateTime.
    4. Vytvořte novou tabulku, která má stejnou strukturu tabulky jako tabulka MyTable.
  5. Vypusťte následující INSERT ... Příkaz SELECT pro vyplnění tabulky MyTable:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

Odkazy