AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 81277
Accepted
wBob
wBob
Asked: 2014-10-29 04:26:01 +0800 CST2014-10-29 04:26:01 +0800 CST 2014-10-29 04:26:01 +0800 CST

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

  • 772

我正在尝试使用 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 不在受支持的库列表中,所以有什么想法吗?

sql-server sql-server-2014
  • 3 3 个回答
  • 19305 Views

3 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2014-10-29T06:26:15+08:002014-10-29T06:26:15+08:00

    您可以使用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)”


    关于您的代码的一些注意事项:

    1. 请不要将 .NET 类型用于参数、输入或输出。因此,更改string encodedXML为SqlString encodedXML。
    2. 这个函数是确定性的,所以应该这样标记,否则你会受到性能影响。添加IsDeterministic = true到SqlFunction属性。
    • 9
  2. Thomas Stringer
    2014-10-29T06:21:57+08:002014-10-29T06:21:57+08:00

    正如您所指出的,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,或者是否有其他途径可以完成您想要的。

    • 8
  3. skeletank
    2015-02-04T06:24:30+08:002015-02-04T06:24:30+08:00

    看看这个答案。您不必使用Uri.UnescapeDataStringor System.Web。有一个名为WebUtilityinside of的类,System.Net其中包含函数HtmlEncode和HtmlDecode。

    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve