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 不在支持的库列表中,所以有什么想法吗?
您可以使用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 库的几个陷阱的其他资源:
关于您的代码的一些说明:
string encodedXML为SqlString encodedXML。IsDeterministic = true到SqlFunction属性。正如您所指出的,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,或者是否有另一种途径来完成你想要的。
| 归档时间: |
|
| 查看次数: |
18293 次 |
| 最近记录: |