MSSQLSERVER_6522

Aplica-se a:SQL Server

Detalhes

Atributo Valor
Nome do Produto SQL Server
ID do evento 6522
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico SQLCLR_UDF_EXEC_FAILED
Texto da mensagem Ocorreu um erro do .NET Framework durante a execução da agregação ou da rotina definida pelo usuário "%.*ls": %ls.

Explicação

Considere os seguintes cenários.

Cenário 1

Você criará uma rotina do CLR (Common Language Runtime) que referencia um assembly do Microsoft .NET Framework. O assembly do .NET Framework não está documentado em 922672. Em seguida, você instalará o .NET Framework 3.5 ou um hotfix baseado no .NET Framework 2.0.

Cenário 2

Você criará um assembly e o registrará em um banco de dados SQL Server. Depois, você instalará outra versão do assembly no GAC (cache de assembly global).

Ao executar a rotina do CLR ou usar o assembly de um desses cenários no SQL Server, você receberá uma mensagem de erro semelhante à seguinte:

Servidor: Mensagem 6522, Nível 16, Estado 2, Linha 1
Ocorreu um erro do .NET Framework durante a execução da agregação ou da rotina definida pelo usuário 'getsid':

System.IO.FileLoadException: Não foi possível carregar o arquivo nem o assembly 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' nem uma das dependências dele. O assembly no repositório do host tem uma assinatura diferente daquela do assembly no GAC. (Exceção de HRESULT: 0x80131050)

Causa possível

Quando o CLR carrega um assembly, ele verifica se o mesmo assembly está no GAC. Se o mesmo assembly estiver no GAC, o CLR verificará se as MVIDs (IDs de Versão do Módulo) desses assemblies são correspondentes. Se as MVIDs desses assemblies não forem correspondentes, você receberá a mensagem de erro informando uma menção disso na seção Explicação.

Quando um assembly é recompilado, a MVID do assembly é alterada. Portanto, se você atualizar o .NET Framework, os assemblies do .NET Framework terão MVIDs diferentes, porque esses assemblies serão recompilados. Além disso, se você atualizar seu assembly, ele será recompilado. Portanto, o assembly também tem outra MVID.

Ação do usuário

Action 1

Para resolver o cenário 1 na seção Explicação, você precisará atualizar manualmente os assemblies do .NET Framework no SQL Server. Para fazer isso, use a instrução ALTER ASSEMBLY de modo que ela aponte para a nova versão do assembly do .NET Framework na seguinte pasta:

%Windir%\Microsoft.NET\Framework\Version

Observação

Versão representa a versão do .NET Framework instalada ou atualizada.

Ação 2

Para resolver o cenário 2 na seção Explicação, use a instrução ALTER ASSEMBLY para atualizar o assembly no banco de dados.

Se o problema ainda existir depois que você fizer isso, remova o assembly do banco de dados e registre a nova versão do assembly no banco de dados.

Mais informações

Não recomendamos que você use assemblies do .NET Framework que não estejam documentados em Política de suporte para assemblies do .NET Framework não testados no ambiente hospedado pelo CLR do SQL Server. O artigo lista os assemblies que foram testados no ambiente hospedado no CLR do SQL Server.

Descrição das rotinas do CLR

As rotinas do CLR incluem os seguintes objetos que são implementados usando a integração do SQL Server ao CLR do .NET Framework:

  • Funções definidas pelo usuário com valor escalar (UDFs escalares)
  • Funções definidas pelo usuário com valor de tabela (TVFs)
  • Procedimentos definidos pelo usuário (UDPs)
  • Gatilhos definidos pelo usuário
  • Tipos de dados definidos pelo usuário
  • Agregações definidas pelo usuário

Assemblies a serem atualizados após a instalação do .NET Framework 3.5

Depois de instalar o .NET Framework 3.5, você precisará usar a instrução ALTER ASSEMBLY para atualizar os seguintes assemblies:

  • 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

Esses assemblies estão na seguinte pasta:

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

Como preservar os dados de tipos de dados definidos pelo usuário depois de remover um assembly

Se você remover um assembly usado por um tipo de dados definido pelo usuário do SQL Server, use um dos métodos a seguir para preservar os dados.

Imagine o seguinte cenário:

  • Você cria um assembly cujo nome é MyAssembly.dll.
  • O assembly MyAssembly referencia o assembly System.DirectoryServices.dll.
  • Você tem um tipo de dados definido pelo usuário cujo nome é MyDateTime.
  • O tipo de dados MyDateTime usa o assembly MyAssembly.dll.
  • Você cria uma tabela cujo nome é MyTable.
  • A tabela MyTable contém os dados do tipo de dados MyDateTime.

Método 1: Usar o utilitário bcp.exe

  1. Use o utilitário bcp.exe junto com a opção -n para copiar os dados da tabela MyTable para um arquivo. Por exemplo, execute o seguinte comando em um prompt de comando:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. No SQL Server Management Studio, siga estas etapas:

    1. Remova a tabela MyTable.
    2. Remova o tipo de dados MyDateTime.
    3. Remova o assembly System.DirectoryServices.dll.
    4. Remova o assembly MyAssembly.
  3. No SQL Server Management Studio, siga estas etapas:

    1. Registre o assembly System.DirectoryServices.dll.
    2. Registre o assembly MyAssembly.
    3. Crie o tipo de dados MyDateTime.
    4. Crie uma tabela que tenha a mesma estrutura da tabela MyTable.
  4. Use o utilitário bcp.exe junto com a opção -n para importar os dados do arquivo para a tabela MyTable. Por exemplo, execute o seguinte comando em um prompt de comando:

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

Método 2: Use a instrução INSERT... Instrução SELECT

Suponha que o tipo de dados MyDateTime ocupe 9 bytes no armazenamento.

  1. No SQL Server Management Studio, crie uma tabela que contenha uma coluna do tipo de dados VARBINARY(9) executando a seguinte instrução:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. Execute a instrução INSERT... SELECT para preencher a tabela TempTable:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. No SQL Server Management Studio, siga estas etapas:

    1. Remova a tabela MyTable.
    2. Remova o tipo de dados MyDateTime.
    3. Remova o assembly System.DirectoryServices.dll.
    4. Remova o assembly MyAssembly.
  4. No SQL Server Management Studio, siga estas etapas:

    1. Registre o assembly System.DirectoryServices.dll.
    2. Registre o assembly MyAssembly.
    3. Crie o tipo de dados MyDateTime.
    4. Crie uma tabela que tenha a mesma estrutura da tabela MyTable.
  5. Execute a instrução INSERT... SELECT para preencher a tabela MyTable:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

Referências