我正在为我的客户开发一个CLR存储过程。涉及两个程序集。 CLR程序集包含“存储过程”和执行某些操作的“引擎”。 (我正在开发两者。)如果有必要,我可以详细介绍这个问题,但我不认为这与问题直接相关。
当我测试我的早期原型时,我让Visual Studio生成在SQL服务器上注册程序集和CLR过程的脚本。它使用以下语法注册程序集...
CREATE ASSEMBLY [Blah.Blah.Engine]
AUTHORIZATION [dbo]
FROM 0x4D5A9000030000000....
CREATE ASSEMBLY [Blah.Blah]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300.....
然后它创建程序。这很好用。但是,不是将十六进制位作为CREATE ASSEMBLY
语句的一部分发送,而是我们要做的是将已编译的.DLL文件复制到磁盘并使用程序集的路径来注册它们,就像这样......
CREATE ASSEMBLY [Blah.Blah.Engine]
AUTHORIZATION [dbo]
FROM 'C:\MyFolder\Blah.Blah.Engine.dll'
然而,当我这样做时,我收到以下错误:
Msg 10301,Level 16,State 1,Line 26 Assembly'Brah.Blah.Engine' 引用程序集'system.data.datasetextensions,version = 4.0.0.0, culture = neutral,publickeytoken = b77a5c561934e089。',但不是 存在于当前数据库中。 SQL Server试图找到和 从同一位置自动加载引用的程序集 引用程序集来自哪里,但该操作失败了 (原因:2(系统找不到指定的文件。))。请加载 引用的程序集进入当前数据库并重试您的 请求。
是的,我的引擎正在引用system.data.datasetextensions。但是,如果我使用第一种语法,我不会得到这个错误。我非常希望不必使用WITH PERMISSION_SET = UNSAFE
短语,并且必须手动将所有引用的程序集复制到服务器上的“MyFolder”中。这似乎不是正确的方式。但是如果正确地发送这些位,那么当我第二种方式执行时它为什么不起作用?