Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
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 -TV SQL Server Management Studio postupujte podle těchto kroků:
- Zrušte tabulku MyTable.
- Vyřaďte datový typ MyDateTime.
- Zrušte
System.DirectoryServices.dllten soubor. - Zrušte sestavení MyAssembly.
V SQL Server Management Studio postupujte podle těchto kroků:
- Zaregistrujte shromáždění
System.DirectoryServices.dll. - Zaregistrujte shromáždění MyAssembly.
- Vytvořte datový typ MyDateTime.
- Vytvořte novou tabulku, která má stejnou strukturu tabulky jako tabulka MyTable.
- Zaregistrujte shromáždění
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.
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));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;V SQL Server Management Studio postupujte podle těchto kroků:
- Zrušte tabulku MyTable.
- Vyřaďte datový typ MyDateTime.
- Zrušte System.DirectoryServices.dll sestavu.
- Zrušte sestavení MyAssembly.
V SQL Server Management Studio postupujte podle těchto kroků:
- Zaregistrujte System.DirectoryServices.dll sestavu.
- Zaregistrujte shromáždění MyAssembly.
- Vytvořte datový typ MyDateTime.
- Vytvořte novou tabulku, která má stejnou strukturu tabulky jako tabulka MyTable.
Vypusťte následující INSERT ... Příkaz SELECT pro vyplnění tabulky MyTable:
INSERT INTO MyTable SELECT c1 FROM TempTable;
Odkazy
- Pro více informací o assemblerové verzi viz dokumentace Visual Studio 2005 Retired Documentation.
- Pro více informací o tom, jak aktualizovat sestavu, viz ALTER ASSEMBLY (Transact-SQL).
- Pro více informací o tom, jak sestavu spustit, viz DROP ASSEMBLY (Transact-SQL).
- Pro více informací o tom, jak zaregistrovat assembler v databázi SQL Server, viz CREATE ASSEMBLY (Transact-SQL).
- Pro více informací o Bcp.exe užitku viz https://msdn2.microsoft.com/library/ms162802.aspx.