Сборка 'system.web, версия = 4.0.0.0, культура = нейтральная, publickeytoken = b03f5f7f11d50a3a.' не был найден в каталоге SQL

9

Я пытаюсь развернуть функцию SQL CLR, используя метод HTTPUtility.UrlDecode System.Web, но не могу ее развернуть. Ошибка получена:

Поставщик данных .Net SqlClient: Msg 6503, уровень 16, состояние 12, сборка линии 1 'system.web, версия = 4.0.0.0, культура = нейтральная, publickeytoken = b03f5f7f11d50a3a.' не был найден в каталоге SQL.

Функция (как часть проекта 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);
    }
}

Это по отношению к этой теме . Я SQL Server 2014 с VS2012 SSDT и база данных проекта. Пробовал с другими целевыми структурами, например, 3, 3,5, 4 и 4,5.

Я также пробовал CREATE ASSEMBLY с System.Web, но затем мне нужно добавить другие сборки, например, Microsoft.Build, System.Xaml, пока они тоже не выйдут из строя. Я вижу, что System.Web отсутствует в списке поддерживаемых библиотек, так что есть идеи?

wBob
источник

Ответы:

9

Вы можете использовать Uri.UnescapeDataString (in System), в этом случае вам также нужно будет сделать Replace('+', ' ')строку для передачи перед ее передачей Uri.UnescapeDataString, или, если вы не хотите с этим беспокоиться, эта функция доступна в бесплатной версии SQL # (который я автор).

Импорт System.Web, вероятно, больше работы, чем стоит. И на самом деле это может быть рискованно. Есть веская причина, System.Webкоторой нет в списке «Поддерживаемые библиотеки», на который вы ссылались в вопросе: он не гарантированно работает! Вы можете столкнуться с ситуациями, особенно при работе с неамериканскими наборами символов ASCII, которые ведут себя не так, как ожидалось, и Microsoft не исправит это. Так что , если вы абсолютно не должны, вы должны быть осторожны при добавлении не поддерживаемой библиотеки DLL. Библиотеки DLL в списке «Поддерживаемые» были полностью протестированы и проверены для работы с сопоставлениями SQL Server и любыми другими проблемами среды, которые отличаются между стандартным CLR, работающим в Windows, и CLR, работающим внутри SQL Server.

Вот некоторые дополнительные ресурсы от Microsoft относительно нескольких ловушек для включения неподдерживаемых библиотек .NET Framework:


Несколько замечаний о вашем коде:

  1. Пожалуйста, не используйте типы .NET для параметров, ввода или вывода. Следовательно, измениться, string encodedXMLчтобы быть SqlString encodedXML.
  2. Эта функция является детерминированной, поэтому должна быть помечена как таковая, иначе вы столкнетесь с падением производительности. Добавьте IsDeterministic = trueк SqlFunctionатрибуту.
Соломон Руцкий
источник
8

Как вы заметили, System.Webэто неподдерживаемая библиотека. Для ссылки System.Webвам нужно будет позвонить на CREATE ASSEMBLY. Кажется, вы пробовали это, но как вы указали местоположение System.Web.dll? Вы скопировали / вставили его в другое место? SQL Server попытается найти зависимые сборки в том же месте. Другими словами, если вы ссылаетесь на расположение System.Web.dllвсех других зависимых библиотек, находящихся в одном каталоге, все должно работать нормально. Вот рабочий пример. Я смог добавить как System.Webсборку, так и вашу сборку:

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

Вы можете видеть из сообщений клиента все другие сборки, которые загружает SQL Server. Но обратите внимание, SQL Server отображает следующее предупреждение для каждого из них:

Ваша регистрация не полностью протестирована в среде, размещенной на SQL Server, и не поддерживается. В будущем, если вы обновите или обслужите эту сборку или .NET Framework, ваша процедура интеграции CLR может перестать работать. Пожалуйста, обратитесь к электронной документации по SQL Server для получения более подробной информации.

Точно так же, но добавляя System.Web, взгляните на следующие сборки, которые добавляются:

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

Стоит помнить о том, что на самом деле здесь происходит, и хотя другие дополнительные сборки не имеют путей для точек входа T-SQL, они теперь являются зависимостью. Я бы взвесил варианты, чтобы увидеть, нужно ли вам ссылатьсяSystem.Web или есть другой путь, чтобы выполнить то, что вы хотите.

Томас Стрингер
источник
1
Спасибо Томас, что сработало. Я пытался CREATE ASSEMBLY, указывая на System.Web.dll в сценарии через графический интерфейс. Я экспериментировал с этим как с ответом на пост группы новостей (связанный ранее), так что не было ни малейшего желания использовать его самому.
wBob
1
@wBob: если вам не нужно, вы должны быть осторожны с добавлением неподдерживаемых библиотек DLL. Есть веская причина, System.Webкоторой нет в списке «Поддерживаемые библиотеки», на который вы ссылаетесь: он не гарантированно работает! , Вы можете столкнуться с ситуациями, особенно при работе с неамериканскими наборами символов ASCII, которые ведут себя не так, как ожидалось, и Microsoft не исправит это. Я добавлю примечание об этом в своем ответе, чтобы быть понятным для тех, кто может не знать.
Соломон Руцкий,
@srutzky Я согласен.
wBob
1
Вы спасатель жизни. Я собирался быть SOL, если я не мог импортировать эту библиотеку. (Это один из тех крайне редких случаев.)
devinbost
5

Проверьте этот ответ . Вам не нужно использовать Uri.UnescapeDataStringили System.Web. Существует класс, вызываемый WebUtilityвнутри System.Netфункции HtmlEncodeи HtmlDecode.

skeletank
источник
Следует отметить, что WebUtilityон доступен только для тех, кто использует SQL Server 2012, 2014 или новее. Те, кто все еще работают на SQL Server 2005, 2008 и 2008 R2, не смогут использовать это из-за того, что они были введены в .NET Framework 4.0.
Соломон Руцки
@srutzky Вопрос на 2014 год, но важно, чтобы пользователи знали об этом ограничении. У вас есть ссылка, которую я мог бы опубликовать и показывающая связь между версией .NET Framework и версией SQL Server?
скелетбанк
Моя статья была опубликована сегодня, поэтому теперь существует диаграмма, показывающая взаимосвязь между версиями SQL Server и функциями SQLCLR (включая версии Framework и CLR): Лестница к SQLCLR Уровень 5: Разработка (Использование .NET в SQL Server) (требуется бесплатная регистрация) ).
Соломон Руцки