Sql server SQL Server SQLCLR函数在从一个数据库复制到另一个数据库后收到参数错误

Sql server SQL Server SQLCLR函数在从一个数据库复制到另一个数据库后收到参数错误,sql-server,parameters,ssms,sqlclr,generate-scripts,Sql Server,Parameters,Ssms,Sqlclr,Generate Scripts,我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本汇编作为create to,并在新数据库中创建了它 当我尝试在较新的数据库中发送带有该功能的电子邮件时,我收到以下错误: 参数“fileName”不能为空字符串。参数名称:fileName 如何跨数据库复制程序集 一些细节: 两个数据库都在同一个实例上 两个数据库都属于同一个登录名 使用SQL Server 2016 在两个数据库中,程序集都标记为不安全 两个数据库都启用了trustry T-SQL包装器对象是标量函数/U

我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本汇编作为create to,并在新数据库中创建了它

当我尝试在较新的数据库中发送带有该功能的电子邮件时,我收到以下错误:

参数“fileName”不能为空字符串。参数名称:fileName

如何跨数据库复制程序集

一些细节:

  • 两个数据库都在同一个实例上
  • 两个数据库都属于同一个登录名
  • 使用SQL Server 2016
  • 在两个数据库中,程序集都标记为
    不安全
  • 两个数据库都启用了
    trustry
  • T-SQL包装器对象是标量函数/UDF
  • 函数在两个DBs中的调用方式相同
如何跨数据库复制程序集

到目前为止,我还没有看到这是一个SQLCLR问题。您显然复制了程序集和T-SQL包装器对象,否则您将得到T-SQL错误而不是.NET错误

我单击脚本汇编作为create to,并在新数据库中创建了它

假设您编写了T-SQL包装器对象的脚本,并且遇到了与输入参数相关的错误,您可能会遇到一个错误,导致
NVARCHAR
参数的默认值无法正确编写脚本:

在旧数据库和新数据库中执行以下操作,以确保所有参数定义都相同,包括任何潜在的默认值(请密切注意
[具有默认值]
1
行):

选择[name]、[user\u type\u id]、[max\u length]、[is\u output],
[具有默认值],[默认值]
从sys.parameters prm
其中prm.[object_id]=object_id(N'dbo.ObjectName')
按prm排序。[参数_id];
如果发现任何差异,则需要更新
CREATE
语句以包含正确的默认值。例如,如果您有:

@SomeParam[nvarchar](1-4000)=N``
然后,您需要将T-SQL脚本的该部分更新为:

@SomeParam[nvarchar](1-4000)=NULL
然后重新运行
CREATE
(您可能需要先
删除现有的T-SQL包装对象,或者将
CREATE
更改为
ALTER

请投票支持我上面链接的反馈错误报告。谢谢


有关一般使用SQLCLR的更多信息,请访问:

您似乎已经复制了程序集,否则将无法调用它并获得错误。现在,您需要找出新数据库中缺少的环境的哪一部分,以便
文件名
最终为空。您可以告诉我如何解决这一问题吗…?查看程序集的源代码。按照我的理解,源代码被转换为二进制代码,因此不再需要查看除非我从二进制代码创建文件,但我试图避免这种情况。您没有程序集的源代码吗?