MSSQLSERVER_6522

Применимо к:SQL Server

Сведения

Атрибут значение
Название продукта SQL Server
Идентификатор события 6522
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя SQLCLR_UDF_EXEC_FAILED
Текст сообщения Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или статистической функции "%.*ls": %ls.

Пояснение

Рассмотрим следующие сценарии.

Сценарий 1

Вы создаете подпрограмму среды CLR, которая ссылается на сборку Microsoft .NET Framework. Эта сборка .NET Framework не задокументирована в 922672. После этого вы устанавливаете исправление на основе .NET Framework 3.5 или .NET Framework 2.0.

Сценарий 2

Вы создаете сборку, а затем регистрируете сборку в базе данных SQL Server. После этого вы устанавливаете другую версию сборки в глобальный кэш сборок.

При выполнении подпрограммы СРЕДЫ CLR или использовании сборки из одного из этих сценариев в SQL Server вы получите сообщение об ошибке, похожее на следующее:

Сервер: Msg 6522, level 16, State 2, Line 1
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или статистической функции "getsid".

System.IO.FileLoadException: не удалось загрузить файл или сборку System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a или одну из зависимостей. Сигнатура сборки в хранилище узлов отличается от сигнатуры в глобальном кэше сборок. (Исключение из HRESULT: 0x80131050)

Возможная причина

Когда среда CLR загружает сборку, она проверяет наличие той же сборки в глобальном кэше сборок. Если та же сборка уже есть в глобальном кэше сборок, среда CLR проверяет, совпадают ли у них идентификаторы версий модулей (MVID). Если идентификаторы MVID у сборок не совпадают, появляется сообщение об ошибке, которое описано в разделе Пояснение.

При повторной компиляции сборки у нее изменяется значение MVID. Это означает, что после обновления .NET Framework все сборки .NET Framework получат новые идентификаторы MVID, так как эти сборки компилируются заново. Кроме того, сборка компилируется заново при любом обновлении самой сборки. Это означает, что при обновлении она также получит новый MVID.

Действие пользователя

Действие 1

Чтобы обойти сценарий 1 в разделе "Объяснение ", необходимо вручную обновить сборки .NET Framework в SQL Server. Для этого выполните инструкцию ALTER ASSEMBLY с указанием на новую версию сборки для платформы .NET Framework в следующей папке:

%Windir%\Microsoft.NET\Framework\Version

Заметка

Здесь Version обозначает версию установленной или обновленной платформы .NET Framework.

Действие 2

Чтобы обойти проблему, описанную в сценарии 2 раздела Пояснение, выполните инструкцию ALTER ASSEMBLY для обновления сборки в базе данных.

Если с помощью этих действий не удается устранить ошибку, удалите сборку из базы данных и зарегистрируйте новую версию сборки.

Дополнительные сведения

Мы не рекомендуем использовать сборки .NET Framework, которые не описаны в статье Политика поддержки нетестируемых сборок .NET Framework в среде SQL Server на основе среды CLR. В нем перечислены сборки, тестируемые в среде, размещенной в СРЕДЕ SQL Server CLR.

Описание подпрограмм среды CLR

Подпрограммы СРЕДЫ CLR включают следующие объекты, реализованные с помощью интеграции SQL Server с средой CLR .NET Framework:

  • определяемые пользователем функции, возвращающие скалярное значение (скалярные определяемые пользователем функции);
  • определяемые пользователем функции, возвращающие табличные значения (возвращающие табличное значение функции);
  • определяемые пользователем процедуры (определяемые пользователем процедуры);
  • определяемые пользователем триггеры.
  • Определяемые пользователем типы данных
  • определяемые пользователем агрегатные функции;

Сборки, которые нужно обновить после установки .NET Framework 3.5

После установки .NET Framework 3.5 необходимо обновить следующие сборки с помощью инструкции ALTER ASSEMBLY:

  • 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.

Эти сборки расположены в следующей папке:

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

Сохранение данных из определяемых пользователем типов данных после удаления сборки

Если удалить сборку, которую использует определяемый пользователем тип данных из SQL Server, можно использовать один из следующих методов для сохранения данных.

Предположим, что используется следующий сценарий:

  • Вы создали сборку с именем MyAssembly.dll.
  • Сборка MyAssembly ссылается на сборку System.DirectoryServices.dll.
  • У вас есть определяемый пользователем тип данных с именем MyDateTime.
  • Тип данных MyDateTime использует сборку MyAssembly.dll.
  • Вы создали таблицу с именем MyTable.
  • Таблица MyTable содержит данные с типом MyDateTime.

Метод 1. Использование служебной программы bcp.exe

  1. Используйте служебную программу bcp.exe с аргументом -n, чтобы скопировать данные из таблицы MyTable в файл. Например, выполните в командной строке следующую команду:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. В SQL Server Management Studio выполните следующие действия.

    1. Удалите таблицу MyTable.
    2. Удалите тип данных MyDateTime.
    3. Удалите сборку System.DirectoryServices.dll.
    4. Удалите сборку MyAssembly.
  3. В SQL Server Management Studio выполните следующие действия.

    1. Зарегистрируйте сборку System.DirectoryServices.dll.
    2. Зарегистрируйте сборку MyAssembly.
    3. Создайте тип данных MyDateTime.
    4. Создайте новую таблицу с такой же структурой, как у таблицы MyTable.
  4. Импортируйте данные из файла в таблицу MyTable с помощью служебной программы bcp.exe с аргументом -n. Например, выполните в командной строке следующую команду:

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

Метод 2. Использование INSERT ... Инструкция SELECT

Предположим, что тип данных MyDateTime занимает 9 байт в хранилище.

  1. В SQL Server Management Studio создайте новую таблицу, содержащую столбец VARBINARY(9) типа данных, выполнив следующую инструкцию:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Выполните следующую инструкцию INSERT ... Инструкция SELECT для заполнения таблицы TempTable:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. В SQL Server Management Studio выполните следующие действия.

    1. Удалите таблицу MyTable.
    2. Удалите тип данных MyDateTime.
    3. Удалите сборку System.DirectoryServices.dll.
    4. Удалите сборку MyAssembly.
  4. В SQL Server Management Studio выполните следующие действия.

    1. Зарегистрируйте сборку System.DirectoryServices.dll.
    2. Зарегистрируйте сборку MyAssembly.
    3. Создайте тип данных MyDateTime.
    4. Создайте новую таблицу с такой же структурой, как у таблицы MyTable.
  5. Выполните следующую инструкцию INSERT ... Инструкция SELECT для заполнения таблицы MyTable:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

Ссылки