好消息(大部分)
如果您已经将这些程序集加载到 SQL Server 中,那么您有两个选择。首先,如果您使用的是 SSMS,您也许可以编写程序集的脚本。只是:
- 右键单击对象资源管理器中的数据库名称,转到“任务⏵”,然后选择“生成脚本...”。
- 选择“选择特定的数据库对象”并在“SQL 程序集”下选择要编写脚本的期望程序集。
- 单击“下一步>”按钮
- 选择“另存为脚本文件”并输入“文件名:”
- 单击“下一步>”按钮
- 单击“下一步>”按钮
脚本化的对象可能按依赖顺序排列,在这种情况下,CREATE ASSEMBLY
不需要重新排序语句。
如果您遇到错误,如果您需要实际详细信息,则可能需要保存报告。它可能是:
SmoException:找到循环依赖项。
这是我在编写已加载的一些 .NET Framework 库的脚本时遇到的问题。苏……
第二个选项是CREATE ASSEMBLY
通过从系统目录视图中选择它们的内容来简单地构造语句:
SELECT N'CREATE ASSEMBLY ' + QUOTENAME(asm.[name]) + NCHAR(0x0A)
+ N' FROM ' + CONVERT(NVARCHAR(MAX), [content], 1) + NCHAR(0x0A)
+ N' WITH PERMISSION_SET = '
+ CASE asm.[permission_set]
WHEN 3 THEN N'UNSAFE'
ELSE asm.[permission_set_desc] COLLATE DATABASE_DEFAULT
END
FROM sys.assemblies asm
INNER JOIN sys.assembly_files asf
ON asf.[assembly_id] = asm.[assembly_id]
WHERE asf.[file_id] = 1
AND asm.is_user_defined = 1
--AND asm.[name] = N'{{assembly_name}}'
FOR XML AUTO, ELEMENTS;
警告:不要左键单击返回的 XML 值,该值应显示为链接,如果您左键单击它,将打开一个新选项卡,其中包含应该是格式化的 XML 文档。返回的值很可能对于 SSMS 来说太大而无法处理(它肯定是在我的系统上使用 SSMS 18.10),它会永远挂起,你需要强行终止进程(我只是在尝试一个 4 的程序集兆)。您可能有几个作为依赖项加载的程序集,并且这些大小可以快速加起来。
您需要通过右键单击“结果”选项卡中的任意位置并选择“将结果另存为...”来保存结果。我不确定“另存为类型”是否重要,因为它们都是文本并且只有一个值,但我通常选择“所有文件 (*.*)”。
如果文件太大而无法在文本编辑器或 SSMS 中打开,您可以取消对WHERE
谓词过滤的注释[name]
并一次执行一个,或者将其设为IN
列表并一次执行多个。
另请记住:
- 您将需要删除
<asm>
和</asm>
标签。
- 这些值不一定以可以加载的顺序返回,因此您必须进行测试并且可能需要调整
CREATE ASSEMBLY
语句的顺序。
不太好的消息(可能)
SQL Server 检查 GAC 以查找 SQL Server 中引用的同名程序集。如果找到,它将检查版本号并且它们必须相同(即在 SQL Server 中的程序集和 GAC 中的程序集之间)。如果 SQL Server 中的版本不同,您将收到错误消息。这意味着,如果您加载到 SQL Server 中的任何 .NET Framework 程序集通过 Windows 更新(甚至手动更新 .NET)得到更新,那么您可能需要删除这些程序集并重新加载它们,然后是当前版本。