MSSQLSERVER_6522

Şunlar için geçerlidir: SQL Server

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

  1. 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 -T
    
  2. SQL Server Management Studio'da şu adımları izleyin:

    1. MyTable tablosunu bırakın.
    2. MyDateTime veri tipini bırakın.
    3. Montajı System.DirectoryServices.dll bırak.
    4. MyAssembly montajını bırakın.
  3. SQL Server Management Studio'da şu adımları izleyin:

    1. Toplantıyı System.DirectoryServices.dll kaydet.
    2. MyAssembly meclisini kaydedin.
    3. MyDateTime veri tipini oluşturun.
    4. MyTable tablosuyla aynı tablo yapısına sahip yeni bir tablo oluşturun.
  4. 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.

  1. 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));
    
  2. 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;
    
  3. SQL Server Management Studio'da şu adımları izleyin:

    1. MyTable tablosunu bırakın.
    2. MyDateTime veri tipini bırakın.
    3. System.DirectoryServices.dll montajını bırak.
    4. MyAssembly montajını bırakın.
  4. SQL Server Management Studio'da şu adımları izleyin:

    1. System.DirectoryServices.dll toplantısını kaydet.
    2. MyAssembly meclisini kaydedin.
    3. MyDateTime veri tipini oluşturun.
    4. MyTable tablosuyla aynı tablo yapısına sahip yeni bir tablo oluşturun.
  5. Aşağıdaki INSERT işlemleri yap ... MyTable tablosunu doldurmak için SELECT ifadesi:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

References