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ê cria um assembly e, em seguida, registra o assembly em um banco de dados do SQL Server. Depois, você instalará outra versão do assembly no GAC (cache de assembly global).
Ao executar a rotina CLR ou usar o assembly de qualquer um desses cenários no SQL Server, você recebe uma mensagem de erro semelhante à seguinte:
Servidor: Msg 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 ou assembly 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ou uma de suas dependências. 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
Ação 1
Para contornar o cenário 1 na seção Explicação , você deve 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. Ele lista os assemblies testados no ambiente hospedado pelo SQL Server CLR.
Descrição das rotinas do CLR
As rotinas CLR incluem os seguintes objetos que são implementados usando a integração do SQL Server com o 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ê descartar um assembly usado por um tipo de dados definido pelo usuário do SQL Server, poderá usar 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: Use o utilitário bcp.exe
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
No SQL Server Management Studio, siga estas etapas:
- Remova a tabela MyTable.
- Remova o tipo de dados MyDateTime.
- Remova o assembly
System.DirectoryServices.dll
. - Remova o assembly MyAssembly.
No SQL Server Management Studio, siga estas etapas:
- Registre o assembly
System.DirectoryServices.dll
. - Registre o assembly MyAssembly.
- Crie o tipo de dados MyDateTime.
- Crie uma tabela que tenha a mesma estrutura da tabela MyTable.
- Registre o assembly
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 o botão INSERT ... Instrução SELECT
Suponha que o tipo de dados MyDateTime ocupe 9 bytes no armazenamento.
No SQL Server Management Studio, crie uma nova tabela que contenha uma coluna do
VARBINARY(9)
tipo de dados executando a seguinte instrução:CREATE TABLE TempTable (c1 VARBINARY(9));
Execute o seguinte INSERT ... SELECT para preencher a tabela TempTable:
INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
No SQL Server Management Studio, siga estas etapas:
- Remova a tabela MyTable.
- Remova o tipo de dados MyDateTime.
- Remova o assembly System.DirectoryServices.dll.
- Remova o assembly MyAssembly.
No SQL Server Management Studio, siga estas etapas:
- Registre o assembly System.DirectoryServices.dll.
- Registre o assembly MyAssembly.
- Crie o tipo de dados MyDateTime.
- Crie uma tabela que tenha a mesma estrutura da tabela MyTable.
Execute o seguinte INSERT ... SELECT para preencher a tabela MyTable:
INSERT INTO MyTable SELECT c1 FROM TempTable;
Referências
- Para obter mais informações sobre a versão do assembly, confira Documentação sobre a desativação do Visual Studio 2005.
- Para obter mais informações sobre como atualizar um assembly, confira ALTER ASSEMBLY (Transact-SQL).
- Para obter mais informações sobre como remover um assembly, confira DROP ASSEMBLY (Transact-SQL).
- Para obter mais informações sobre como registrar um assembly em um banco de dados SQL Server, consulte CREATE ASSEMBLY (Transact-SQL).
- Para obter mais informações sobre o utilitário bcp.exe, confira https://msdn2.microsoft.com/library/ms162802.aspx.