MSSQLSERVER_6522

Aplica-se a: SQL Server

Details

Attribute 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 de .NET Framework durante a execução de rotina ou agregado definido pelo utilizador "%.*ls": %ls.

Explanation

Considere os seguintes cenários.

Cenário 1

Cria-se uma rotina de execução em linguagem comum (CLR) que faz referência a uma assembly Microsoft .NET Framework. A montagem .NET Framework não está documentada em 922672. Depois, instalas o .NET Framework 3.5 ou um hotfix baseado no .NET Framework 2.0.

Cenário 2

Cria-se um assembly e depois regista-se o assembly numa base de dados do SQL Server. Depois, instalas uma versão diferente do assembly no Global Assembly Cache (GAC).

Quando executa a rotina CLR ou utiliza o assembly de qualquer um destes cenários no SQL Server, recebe uma mensagem de erro que se assemelha ao seguinte:

Servidor: Msg 6522, Nível 16, Estado 2, Linha 1
Ocorreu um erro no .NET Framework durante a execução da rotina definida pelo utilizador ou agregado 'getsid':

System.IO.FileLoadException: Não foi possível carregar ficheiros ou assembly 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ou uma das suas dependências. A assembly na host store tem uma assinatura diferente da assembly no GAC. (Exceção do HRESULT: 0x80131050)

Causa possível

Quando o CLR carrega um conjunto, verifica que o mesmo conjunto está no GAC. Se o mesmo assembly estiver no GAC, o CLR verifica se os IDs de Versão do Módulo (MVIDs) destes assemblies coincidem. Se os MVIDs destes assemblies não coincidirem, recebe a mensagem de erro mencionada na secção Explicação .

Quando um assembly é recompilado, o MVID do assembly muda. Portanto, se atualizares o .NET Framework, os assemblies do .NET Framework têm diferentes MVIDs porque esses assemblies são recompilados. Além disso, se atualizar a sua própria assembleia, a assembly é recompilada. Por isso, a assembleia também tem um MVID diferente.

Ação do usuário

Ação 1

Para contornar o cenário 1 na secção Explicação, deve atualizar manualmente os assemblies do .NET Framework no SQL Server. Para isso, use a ALTER ASSEMBLY instrução para apontar para a nova versão do assembly do .NET Framework na seguinte pasta:

%Windir%\Microsoft.NET\Framework\Version

Note

A versão representa a versão do Framework .NET que instalou ou atualizou.

Ação 2

Para contornar o cenário 2 na secção Explicação , use a ALTER ASSEMBLY instrução para atualizar o assembly na base de dados.

Se o problema continuar a existir depois de fazer isto, retira o assembly da base de dados e depois regista a nova versão do assembly na base de dados.

Mais informações

Não recomendamos que utilize assemblies do .NET Framework que não estejam documentados na política de Suporte para assemblies não testados do .NET Framework no ambiente hospedado pelo SQL Server CLR. Lista os assemblies que são testados no ambiente alojado pelo SQL Server CLR.

Descrição das rotinas CLR

As rotinas CLR incluem os seguintes objetos implementados através da integração do SQL Server com o .NET Framework CLR:

  • Funções definidas pelo utilizador com valores escalares (UDFs escalares)
  • Funções definidas pelo utilizador com valores de tabela (TVFs)
  • Procedimentos definidos pelo utilizador (UDPs)
  • Gatilhos definidos pelo utilizador
  • Tipos de dados definidos pelo utilizador
  • Agregações definidas pelo utilizador

Assemblies a atualizar depois de instalar o .NET Framework 3.5

Depois de instalar o .NET Framework 3.5, deve usar a ALTER ASSEMBLY instrução 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

Estas assembleias encontram-se na seguinte pasta:

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

Como preservar os dados dos tipos de dados definidos pelo utilizador depois de largar um assembly

Se largar um assembly que um tipo de dado definido pelo utilizador do SQL Server utiliza, pode usar um dos seguintes métodos para preservar os dados.

Assuma que o seguinte é o cenário:

  • Cria-se uma assembleia cujo nome éMyAssembly.dll.
  • A assembleia MyAssembly faz referência à System.DirectoryServices.dll assembleia.
  • Tem um tipo de dado definido pelo utilizador cujo nome é MyDateTime.
  • O tipo de dados MyDateTime utiliza a MyAssembly.dll assembly.
  • Crias uma tabela cujo nome é MyTable.
  • A tabela MyTable contém os dados do tipo de dados MyDateTime .

Método 1: Usar a utilidade bcp.exe

  1. Usa a ferramenta Bcp.exe juntamente com o -n switch para copiar os dados da tabela MyTable para um ficheiro. Por exemplo, execute o seguinte comando num prompt de comando:

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

    1. Larga a mesa do MyTable.
    2. Abandona o tipo de dados MyDateTime.
    3. Larga a System.DirectoryServices.dll assembleia.
    4. Larga a montagem do MyAssembly.
  3. No SQL Server Management Studio, siga estes passos:

    1. Registe a System.DirectoryServices.dll assembleia.
    2. Registe-se na assembleia do MyAssembly.
    3. Crie o tipo de dados MyDateTime.
    4. Crie uma nova tabela com a mesma estrutura de tabela da tabela MyTable.
  4. Use o utilitário Bcp.exe juntamente com o -n switch para importar os dados do ficheiro para a tabela MyTable. Por exemplo, execute o seguinte comando num prompt de comando:

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

Método 2: Usar o INSERT ... Instrução SELECT

Assuma que o tipo de dados MyDateTime ocupa 9 bytes em armazenamento.

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

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

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

    1. Larga a mesa do MyTable.
    2. Abandona o tipo de dados MyDateTime.
    3. Larga a System.DirectoryServices.dll montagem.
    4. Larga a montagem do MyAssembly.
  4. No SQL Server Management Studio, siga estes passos:

    1. Registe a System.DirectoryServices.dll assembleia.
    2. Registe-se na assembleia do MyAssembly.
    3. Crie o tipo de dados MyDateTime.
    4. Crie uma nova tabela com a mesma estrutura de tabela da tabela MyTable.
  5. Executa o seguinte INSERT ... Instrução SELECT para preencher a tabela MyTable:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

Referências