Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Details
| Attribute | Değer |
|---|---|
| Ürün Adı | SQL Server |
| Olay Kimliği | 6522 |
| Olay Kaynağı | MSSQLSERVER |
| Bileşen | SQLEngine |
| Sembolik Ad | SQLCLR_UDF_EXEC_FAILED |
| İleti Metni | Kullanıcı tanımlı rutin veya "%.*ls" .NET Framework hatası meydana geldi: %ls. |
Explanation
Aşağıdaki senaryoları inceleyin.
Senaryo 1
Bir Microsoft .NET Framework assembly referansı olan bir ortak dil çalışma zamanı (CLR) rutini oluşturursunuz. .NET Framework montajı 922672'de belgelenmemiştir. Sonra, .NET Framework 3.5 veya .NET Framework 2.0 tabanlı bir hotfix yüklüyorsunuz.
Senaryo 2
Bir assembly oluşturuyorsunuz ve ardından assembly bir SQL Server veritabanına kaydediliyorsunuz. Sonra, Küresel Montaj Önbelleği'ne (GAC) farklı bir montaj sürümü yüklüyorsunuz.
CLR rutinini çalıştırdığınızda veya SQL Server'da bu senaryolardan herhangi birinden assembly kullandığınızda, aşağıdaki gibi bir hata mesajı alırsınız:
Sunucu: Msg 6522, Seviye 16, Durum 2, Hat 1
Kullanıcı tanımlı rutin veya toplu 'getsid' yürütülürken bir .NET Framework hatası meydana geldi:System.IO.FileLoadException: 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' dosyasını veya bağımlılıklarından birini yükleyemedi. Host store'daki assembly'nin imzası GAC'deki assembly'den farklıdır. (HRESULT istisnası: 0x80131050)
Olası neden
CLR bir montajı yüklediğinde, aynı montajın GAC'ta olduğunu doğrular. Aynı montaj GAC'ta ise, CLR bu montajların Modül Sürüm ID'lerinin (MVID) eşleşip eşleşmediğini doğrular. Bu montajların MVID'leri eşleşmiyorsa, Açıklama bölümünde bahsedilen hata mesajını alırsınız.
Bir assembly yeniden derlendiğinde, montajın MVID'i değişir. Bu nedenle, .NET Framework'ü güncellerseniz, .NET Framework montajları farklı MVID'lere sahiptir çünkü bu montajlar yeniden derlenir. Ayrıca, kendi montajınızı güncellerseniz, montaj yeniden derlenir. Bu nedenle, montajın farklı bir MVID'i de vardır.
Kullanıcı eylemi
Aksiyon 1
Açıklama bölümündeki senaryo 1'i aşmak için, SQL Server'daki .NET Framework montajlarını manuel olarak güncellemeniz gerekir. Bunu yapmak için, aşağıdaki klasördeki .NET Framework assembly yeni sürümüne işaret etmek için ifadeyi ALTER ASSEMBLY kullanın:
%Windir%\Microsoft.NET\Framework\Version
Note
Sürüm, kurduğunuz veya güncellettiğiniz .NET Framework sürümünü temsil eder.
Aksiyon 2
Açıklama bölümünde senaryo 2'yi aşmak için, veritabanındaki montajı güncellemek için ifadeyi ALTER ASSEMBLY kullanın.
Bunu yaptıktan sonra da sorun devam ederse, assembly veritabanından çıkar ve ardından assembly yeni sürümünü veritabanına kaydet.
Daha fazla bilgi
SQL Server CLR barındırılan ortamda test edilmemiş .NET Framework montajları için Destek politikasında belgelenmemiş .NET Framework montajlarını kullanmanızı önermiyoruz. SQL Server CLR barındırılan ortamda test edilen montajları listeler.
CLR rutinlerinin tanımı
CLR rutinleri, .NET Framework CLR ile SQL Server entegrasyonu kullanılarak uygulanan aşağıdaki nesneleri içerir:
- Skaler değerli kullanıcı tanımlı fonksiyonlar (skaler UDF'ler)
- Tablo değerli kullanıcı tanımlı fonksiyonlar (TVF'ler)
- Kullanıcı tanımlı prosedürler (UDP'ler)
- Kullanıcı tarafından tanımlanan tetikleyiciler
- Kullanıcı tanımlı veri türleri
- Kullanıcı tanımlı toplamalar
.NET Framework 3.5'i kurduktan sonra güncellenecek assemblerler
.NET Framework 3.5'i yükledikten sonra, aşağıdaki montajları güncellemek için bu ALTER ASSEMBLY ifadeyi kullanmalısınız:
- 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
Bu montajlar aşağıdaki klasörde yer almaktadır:
%Windir%\Microsoft.NET\Framework\v2.0.50727
Bir assembly bıraktıktan sonra kullanıcı tanımlı veri tiplerinden veri nasıl korunur?
SQL Server'dan kullanıcı tanımlı bir veri türünün kullandığı bir assembly bırakırsanız, veriyi korumak için aşağıdaki yöntemlerden birini kullanabilirsiniz.
Aşağıdaki senaryonun olduğunu varsayın:
- Adı MyAssembly.dllolan bir assembly oluşturursunuz.
- MyAssembly assembly assembly (assembly) atıfta bulunur
System.DirectoryServices.dll. - Kullanıcı tarafından tanımlanan bir veri tipiniz var ve adı MyDateTime'dır.
- MyDateTime veri tipi MyAssembly.dll assembly kullanır.
- MyTable adlı bir tablo oluşturuyorsunuz.
- MyTable tablosu, MyDateTime veri türünün verilerini içerir.
Yöntem 1: bcp.exe aracını kullanın
MyTable tablosundan veriyi bir dosyaya kopyalamak için Bcp.exe programını -n anahtarıyla birlikte kullanın. Örneğin, bir komut göndermesinde aşağıdaki komutu çalıştırın:
bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -TSQL Server Management Studio'da şu adımları izleyin:
- MyTable tablosunu bırakın.
- MyDateTime veri tipini bırakın.
- Montajı
System.DirectoryServices.dllbırak. - MyAssembly montajını bırakın.
SQL Server Management Studio'da şu adımları izleyin:
- Toplantıyı
System.DirectoryServices.dllkaydet. - MyAssembly meclisini kaydedin.
- MyDateTime veri tipini oluşturun.
- MyTable tablosuyla aynı tablo yapısına sahip yeni bir tablo oluşturun.
- Toplantıyı
Bcp.exe aracını -n anahtarıyla birlikte kullanarak dosyadan veriyi MyTable tablosuna aktarın. Örneğin, bir komut göndermesinde aşağıdaki komutu çalıştırın:
bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
Yöntem 2: INSERT ... SELECT ifadesi
MyDateTime veri tipinin depolamada 9 bayt yer aldığını varsayalım.
SQL Server Management Studio'da, aşağıdaki ifadeyi çalıştırarak veri tipinin
VARBINARY(9)bir sütununu içeren yeni bir tablo oluşturun:CREATE TABLE TempTable (c1 VARBINARY(9));Aşağıdaki INSERT işlemleri yap ... TempTable tablosunu doldurmak için SELECT ifadesi:
INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;SQL Server Management Studio'da şu adımları izleyin:
- MyTable tablosunu bırakın.
- MyDateTime veri tipini bırakın.
- System.DirectoryServices.dll montajını bırak.
- MyAssembly montajını bırakın.
SQL Server Management Studio'da şu adımları izleyin:
- System.DirectoryServices.dll toplantısını kaydet.
- MyAssembly meclisini kaydedin.
- MyDateTime veri tipini oluşturun.
- MyTable tablosuyla aynı tablo yapısına sahip yeni bir tablo oluşturun.
Aşağıdaki INSERT işlemleri yap ... MyTable tablosunu doldurmak için SELECT ifadesi:
INSERT INTO MyTable SELECT c1 FROM TempTable;
References
- Montaj versiyonu hakkında daha fazla bilgi için Visual Studio 2005 Emekli edilmiş dokümantasyonuna bakınız.
- Bir montajın nasıl güncelleneceği hakkında daha fazla bilgi için (Transact-SQL) sayfasına bakınızALTER ASSEMBLY.
- Bir montajı nasıl düşüreceği hakkında daha fazla bilgi için (Transact-SQL) bölümüne bakınızDROP ASSEMBLY.
- Bir SQL Server veritabanında bir montaj kaydedileceği hakkında daha fazla bilgi için (Transact-SQL) bölümüne bakınızCREATE ASSEMBLY.
- Bcp.exe faydası hakkında daha fazla bilgi için bkz.https://msdn2.microsoft.com/library/ms162802.aspx