Assembly 'system.web, versão = 4.0.0.0, culture = neutral, publickeytoken = b03f5f7f11d50a3a.' não foi encontrado no catálogo SQL


9

Estou tentando implantar uma função SQL CLR usando o método HTTPUtility.UrlDecode do System.Web, mas não consigo implantá-lo. Erro recebido:

Provedor de dados do .NET SqlClient: mensagem 6503, nível 16, estado 12, linha 1 Assembly 'system.web, versão = 4.0.0.0, cultura = neutra, publickeytoken = b03f5f7f11d50a3a.' não foi encontrado no catálogo SQL.

A função (como parte do projeto SSDT):

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
    public static SqlString udf_UrlDecode(SqlString encodedXML)
    {
        string decodedXML;

        decodedXML = HttpUtility.UrlDecode(encodedXML.ToString());

        return new SqlString(decodedXML);
    }
}

É em relação a esta discussão . Sou o SQL Server 2014 com VS2012 SSDT e projeto de banco de dados. Tentei com outras estruturas de destino, por exemplo, 3, 3.5, 4 e 4.5.

Eu também tentei CREATE ASSEMBLY com System.Web, mas depois tenho que adicionar outros assemblies, por exemplo, Microsoft.Build, System.Xaml até que eles também falhem. Vejo System.Web não está na lista de bibliotecas suportadas, então tem alguma idéia?

Respostas:


9

Você pode usar Uri.UnescapeDataString (in System); nesse caso, você também precisará fazer uma Replace('+', ' ')string antes de passá-la para Uri.UnescapeDataString, ou se preferir não se preocupar com isso, essa função estará disponível na versão gratuita do SQL # (da qual sou o autor).

Importar System.Webé provavelmente mais trabalho do que vale a pena. E, de fato, pode ser arriscado. Há um bom motivo para isso System.Webnão constar da lista "Bibliotecas suportadas" às quais você vinculou a pergunta: não é garantido que funcione! Você pode enfrentar situações, especialmente ao lidar com conjuntos de caracteres ASCII que não sejam dos EUA, que não se comportam conforme o esperado, e a Microsoft não o corrigirá. Portanto, a menos que seja absolutamente necessário, você deve ter cuidado ao adicionar DLLs não suportadas. As DLLs na lista "Suportado" foram totalmente testadas e verificadas para funcionar com agrupamentos do SQL Server e quaisquer outros problemas ambientais diferentes entre o CLR padrão em execução no Windows e o CLR em execução no SQL Server.

Aqui estão alguns recursos adicionais da Microsoft sobre várias armadilhas para incorporar bibliotecas do .NET Framework não suportadas:


Algumas notas sobre o seu código:

  1. Por favor, não use tipos .NET para parâmetros, entrada ou saída. Portanto, mude string encodedXMLpara ser SqlString encodedXML.
  2. Esta função é determinística; portanto, deve ser marcada como tal; caso contrário, você sofrerá um impacto no desempenho. Adicione IsDeterministic = trueao SqlFunctionatributo

8

Como você observou, System.Webé uma biblioteca não suportada. Para fazer referência, System.Webvocê precisará fazer uma chamada para CREATE ASSEMBLY. Parece que você tentou isso, mas como você fez referência à localização System.Web.dll? Você copiou / colou em um local diferente? O SQL Server tentará localizar os assemblies dependentes no mesmo local. Em outras palavras, se você fizer referência à localização de System.Web.dlltodas as outras bibliotecas dependentes que vivem no mesmo diretório, ela deverá funcionar perfeitamente. Aqui está um exemplo de trabalho. Consegui adicionar tanto a System.Webmontagem quanto a sua:

create assembly [System.Web]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with permission_set = unsafe;
go

create assembly SystemWebTest
from 'c:\SqlServer\SystemWebTest.dll'
with permission_set = safe;
go

Você pode ver nas mensagens do cliente todos os outros assemblies que o SQL Server carrega. Mas observe, o SQL Server exibe o seguinte aviso para cada um deles:

você está se registrando não é totalmente testado no ambiente hospedado do SQL Server e não é suportado. No futuro, se você atualizar ou reparar esse assembly ou o .NET Framework, sua rotina de integração do CLR poderá parar de funcionar. Consulte os Manuais Online do SQL Server para obter mais detalhes.

Da mesma forma, mas adicionando System.Web, dê uma olhada nos seguintes assemblies adicionados:

select
    name,
    permission_set_desc,
    is_visible
from sys.assemblies
where is_user_defined = 1
order by is_visible desc;

name                                            permission_set_desc is_visible
System.Web                                      UNSAFE_ACCESS       1
SystemWebTest                                   SAFE_ACCESS         1
Microsoft.Build.Framework                       UNSAFE_ACCESS       0
System.Xaml                                     UNSAFE_ACCESS       0
System.ComponentModel.DataAnnotations           UNSAFE_ACCESS       0
System.Runtime.Caching                          UNSAFE_ACCESS       0
System.Web.ApplicationServices                  UNSAFE_ACCESS       0
System.Drawing                                  UNSAFE_ACCESS       0
Microsoft.Build.Utilities.v4.0                  UNSAFE_ACCESS       0
System.DirectoryServices                        UNSAFE_ACCESS       0
System.DirectoryServices.Protocols              UNSAFE_ACCESS       0
System.EnterpriseServices                       UNSAFE_ACCESS       0
System.Runtime.Remoting                         UNSAFE_ACCESS       0
System.Runtime.Serialization.Formatters.Soap    UNSAFE_ACCESS       0
System.Design                                   UNSAFE_ACCESS       0
System.Windows.Forms                            UNSAFE_ACCESS       0
Accessibility                                   UNSAFE_ACCESS       0
System.Drawing.Design                           UNSAFE_ACCESS       0
System.Web.RegularExpressions                   UNSAFE_ACCESS       0
Microsoft.Build.Tasks.v4.0                      UNSAFE_ACCESS       0
System.ServiceProcess                           UNSAFE_ACCESS       0
System.Configuration.Install                    UNSAFE_ACCESS       0
System.Runtime.Serialization                    UNSAFE_ACCESS       0
System.ServiceModel.Internals                   UNSAFE_ACCESS       0
SMDiagnostics                                   UNSAFE_ACCESS       0

Vale a pena ficar atento ao que realmente está acontecendo aqui, e mesmo que os outros assemblies adicionais não possuam formas para os pontos de entrada do T-SQL, eles agora são uma dependência. Eu ponderaria as opções para ver se você realmente precisa fazer referênciaSystem.Web ou se há outra rota para realizar o que deseja.


11
Obrigado Thomas, isso funcionou. Eu estava tentando CREATE ASSEMBLY apontando para System.Web.dll script através da GUI. Eu estava experimentando isso como resposta a uma postagem de um grupo de notícias (vinculado anteriormente), portanto não há desejo ardente de usá-lo.
WBob 28/10/2014

11
@ wBob: a menos que você precise, você deve ter cuidado ao adicionar DLLs não suportadas. Há um bom motivo para isso System.Webnão estar na lista "Bibliotecas suportadas" às quais você vinculou: não é garantido que funcione! . Você pode enfrentar situações, especialmente ao lidar com conjuntos de caracteres ASCII que não sejam dos EUA, que não se comportam conforme o esperado, e a Microsoft não o corrigirá. Acrescentarei uma nota sobre isso na minha resposta apenas para ficar claro para aqueles que podem não saber.
Solomon Rutzky

@srutzky eu concordo.
WBob 28/10/2014

11
Você é um salva-vidas. Eu seria o SOL se não pudesse importar esta biblioteca. (É um daqueles casos extremamente raros.)
devinbost

5

Confira esta resposta . Você não precisa usar Uri.UnescapeDataStringou System.Web. Existe uma classe chamada WebUtilitydentro de System.Netcom as funções HtmlEncodee HtmlDecode.


Você deve salientar que WebUtilityestá disponível apenas para aqueles que usam o SQL Server 2012, 2014 ou mais recente. Os que ainda estão no SQL Server 2005, 2008 e 2008 R2 não poderão usar isso devido à introdução no .NET Framework 4.0.
Solomon Rutzky

@srutzky A pergunta é para 2014, mas é importante que os usuários saibam sobre essa limitação. Você tem um link que eu possa postar que mostre o relacionamento entre a versão do .NET Framework e a versão do SQL Server?
Skeletank # 03/02

Meu artigo foi publicado hoje, então agora existe um gráfico mostrando o relacionamento entre as versões do SQL Server e os recursos do SQLCLR (incluindo as versões Framework e CLR): Stairway to SQLCLR Nível 5: Desenvolvimento (usando .NET no SQL Server) (é necessário registro gratuito )
Solomon Rutzky
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.