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


9

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

.Net SqlClient数据提供程序:消息6503,级别16,状态12,行1程序集'system.web,version = 4.0.0.0,culture = neutral,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);
    }
}

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

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

Answers:


9

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

导入System.Web可能比它值得的工作更多。实际上,这可能是有风险的。有一个很好的理由System.Web不在问题中链接到的“支持的库”列表中:它不能保证正常工作!您可能会遇到某些情况,特别是在处理非美国ASCII字符集时,其行为可能不符合预期,Microsoft不会对其进行修复。因此,除非绝对必要,否则在添加不受支持的DLL时应格外小心。“受支持”列表中的DLL已经过全面测试和验证,可与SQL Server归类和Windows中运行的标准CLR和SQL Server内部运行的CLR之间不同的任何其他环境问题一起使用。

Microsoft提供了一些有关合并不支持的.NET Framework库的陷阱的Microsoft其他资源:


有关代码的一些注意事项:

  1. 请不要将.NET类型用于参数,输入或输出。因此,将更string encodedXML改为SqlString encodedXML
  2. 此功能是确定性的,因此应进行标记,否则会影响性能。添加IsDeterministic = trueSqlFunction属性。

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
谢谢托马斯,那已经奏效了。我正在尝试通过GUI脚本来创建指向System.Web.dll的CREATE ASSEMBLY。我正在尝试以此作为对新闻组帖子(之前已链接)的回答,因此没有强烈的愿望自己使用它。
wBob 2014年

1
@wBob:除非绝对必要,否则在添加不受支持的DLL时应格外小心。您有很好的理由System.Web不在您链接到的“支持的库”列表中:它不能保证正常工作!。您可能会遇到某些情况,特别是在处理非美国ASCII字符集时,其行为可能不符合预期,Microsoft不会对其进行修复。我会在答案中添加一条注释,以使可能不知道的人清楚。
所罗门·鲁兹基2014年

@srutzky我同意。
wBob 2014年

1
您是救生员。如果我无法导入该库,我将成为SOL。(这是极为罕见的情况之一。)
devinbost 2014年

5

看看这个答案。您不必使用Uri.UnescapeDataStringSystem.Web。函数和的WebUtility内部有一个称为的类。System.NetHtmlEncodeHtmlDecode


您应该指出,WebUtility仅适用于使用SQL Server 2012、2014或更高版本的用户。那些仍在SQL Server 2005、2008和2008 R2上的用户将无法使用此功能,因为它是在.NET Framework 4.0中引入的。
所罗门·鲁兹基

@srutzky这个问题是针对2014年的,但让用户知道此限制很重要。我是否可以发布一个链接来显示.NET Framework版本和SQL Server版本之间的关系?
skeletank 2015年

我的文章今天发表,所以现在确实存在一个图表,显示SQL Server版本与SQLCLR功能(包括Framework和CLR版本)之间的关系:通往SQLCLR的阶梯级别5:开发(在SQL Server中使用.NET)(需要免费注册) )。
所罗门·鲁兹基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.