我正在尝试使用 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);
}
}
它与这个线程有关。我是带有 VS2012 SSDT 和数据库项目的 SQL Server 2014。已尝试使用其他目标框架,例如 3、3.5、4 和 4.5。
我也尝试过使用 System.Web 创建程序集,但随后必须添加其他程序集,例如 Microsoft.Build、System.Xaml,直到它们也失败。我看到 System.Web 不在受支持的库列表中,所以有什么想法吗?
您可以使用Uri.UnescapeDataString (in
System
),在这种情况下,您还需要在将字符串传递给之前Replace('+', ' ')
对字符串执行 a 操作,或者如果您不想打扰它,此函数在SQL 的免费版本中可用#(我是作者)。Uri.UnescapeDataString
导入
System.Web
可能比它的价值更多的工作。事实上,这可能是有风险的。System.Web
您在问题中链接到的“支持的库”列表中没有一个很好的理由:它不能保证工作!您可能会遇到不符合预期的情况,尤其是在处理非美国 ASCII 字符集时,Microsoft 不会修复它。因此,除非您绝对必须这样做,否则您应该小心添加不受支持的 DLL。“支持”列表中的 DLL 已经过全面测试和验证,可以处理 SQL Server 排序规则以及在 Windows 中运行的标准 CLR 和在 SQL Server 中运行的 CLR 之间存在差异的任何其他环境问题。以下是 Microsoft 提供的一些额外资源,涉及合并不受支持的 .NET Framework 库的几个陷阱:
SQL Server CLR 托管环境中未经测试的 .NET Framework 程序集的支持策略
在 SQL Server 中执行 CLR 例程或使用程序集时出现错误消息:“主机存储中的程序集与 GAC 中的程序集具有不同的签名。(来自 HRESULT 的异常:0x80131050)”
关于您的代码的一些注意事项:
string encodedXML
为SqlString encodedXML
。IsDeterministic = true
到SqlFunction
属性。正如您所指出的,
System.Web
是一个不受支持的库。为了参考System.Web
,您需要调用CREATE ASSEMBLY
. 似乎您尝试过,但是您是如何引用的位置的System.Web.dll
?您是否将其复制/粘贴到其他位置?SQL Server 将尝试将依赖程序集定位在同一位置。换句话说,如果您引用位于System.Web.dll
同一目录中的所有其他依赖库的位置,它应该可以正常工作。这是一个工作示例。我能够添加System.Web
程序集以及您的程序集:您可以从客户端消息中看到 SQL Server 加载的所有其他程序集。但请注意,SQL Server 会针对其中的每一个显示以下警告:
同样,但要添加
System.Web
,请查看添加的以下程序集:值得注意的是这里实际发生的情况,即使其他附加程序集没有 T-SQL 入口点的方法,它们现在也是一个依赖项。我会权衡选项,看看您是否真的需要参考
System.Web
,或者是否有其他途径可以完成您想要的。看看这个答案。您不必使用
Uri.UnescapeDataString
orSystem.Web
。有一个名为WebUtility
inside of的类,System.Net
其中包含函数HtmlEncode
和HtmlDecode
。