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?
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:
Por favor, não use tipos .NET para parâmetros, entrada ou saída. Portanto, mude string encodedXMLpara ser SqlString encodedXML.
Esta função é determinística; portanto, deve ser marcada como tal; caso contrário, você sofrerá um impacto no desempenho. Adicione IsDeterministic = trueao SqlFunctionatributo
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:
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.
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 )
System.Web
nã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.Confira esta resposta . Você não precisa usar
Uri.UnescapeDataString
ouSystem.Web
. Existe uma classe chamadaWebUtility
dentro deSystem.Net
com as funçõesHtmlEncode
eHtmlDecode
.fonte
WebUtility
está 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.