程序集“system.web,版本=4.0.0.0,文化=中性,publickeytoken=b03f5f7f11d50a3a。” 在 SQL 目录中找不到

wBo*_*Bob 9 sql-server sql-clr sql-server-2014

我正在尝试使用 System.Web 的 HTTPUtility.UrlDecode 方法部署 SQL CLR 函数,但我无法部署它。收到错误:

.Net SqlClient 数据提供程序:消息 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它与这个线程有关。我是带有 VS2012 SSDT 和数据库项目的 SQL Server 2014。已尝试使用其他目标框架,例如 3、3.5、4 和 4.5。

我也尝试过使用 System.Web 创建程序集,但随后必须添加其他程序集,例如 Microsoft.Build、System.Xaml,直到它们也失败。我看到 System.Web 不在支持的库列表中,所以有什么想法吗?

Sol*_*zky 9

您可以使用Uri.UnescapeDataString (in System),在这种情况下,您还需要Replace('+', ' ')在将字符串传递给之前对字符串执行 a操作Uri.UnescapeDataString,或者如果您不想理会它,该函数在SQL#的免费版本中可用(我是作者)。

导入System.Web可能比它的价值更多。事实上,这可能是有风险的。有一个很好的理由System.Web不在您在问题中链接到的“支持的库”列表中:它不能保证工作!您可能会遇到一些情况,尤其是在处理非美国 ASCII 字符集时,行为不符合预期,并且 Microsoft 不会修复它。因此,除非您绝对必须这样做,否则您应该小心添加不受支持的 DLL。“支持”列表中的 DLL 已经过全面测试和验证,可以处理 SQL Server 排序规则以及在 Windows 中运行的标准 CLR 和在 SQL Server 内部运行的 CLR 之间不同的任何其他环境问题。

以下是 Microsoft 提供的一些关于合并不受支持的 .NET Framework 库的几个陷阱的其他资源:


关于您的代码的一些说明:

  1. 请不要将 .NET 类型用于参数、输入或输出。因此,更改string encodedXMLSqlString encodedXML
  2. 这个函数是确定性的,所以应该被标记为这样,否则你将遭受性能损失。添加IsDeterministic = trueSqlFunction属性。


Tho*_*ger 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
Run Code Online (Sandbox Code Playgroud)

您可以从客户端消息中看到 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
Run Code Online (Sandbox Code Playgroud)

值得注意这里实际发生的事情,尽管其他附加程序集没有 T-SQL 入口点的方法,但它们现在是一个依赖项。我会权衡选项,看看你是否真的需要参考System.Web,或者是否有另一种途径来完成你想要的。


ske*_*ank 5

看看这个答案。您不必使用Uri.UnescapeDataStringSystem.Web。有一个类调用WebUtilityinsideSystem.Net函数HtmlEncodeHtmlDecode