1

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

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

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

如何跨数据库复制程序集?

一些细节:

  • 两个数据库都在同一个实例上
  • 两个数据库都属于同一个登录名
  • 使用 SQL Server 2016
  • UNSAFE程序集在两个数据库中都标记为
  • 两个数据库都已TRUSTWORTHY启用
  • T-SQL 包装对象是一个标量函数/UDF
  • 两个数据库中的函数调用方式相同
4

1 回答 1

1

如何跨数据库复制程序集?

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

我单击脚本程序集作为创建并在新数据库中创建它。

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

SSMS 脚本 CLR 存储过程 NVARCHAR 参数 NULL 默认为 N''(空字符串)

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

SELECT [name], [user_type_id], [max_length], [is_output],
       [has_default_value], [default_value]
FROM   sys.parameters prm
WHERE  prm.[object_id] = OBJECT_ID(N'dbo.ObjectName')
ORDER BY prm.[parameter_id];

如果您发现任何差异,您将需要更新您的CREATE语句以包含正确的默认值。例如,如果您有:

@SomeParam [nvarchar](1 - 4000) = N``

然后,您需要将 T-SQL 脚本的该部分更新为:

@SomeParam [nvarchar](1 - 4000) = NULL

然后重新运行CREATE(您可能需要首先DROP使用现有的 T-SQL 包装器对象,或者将其更改CREATEALTER)。

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

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

于 2020-01-14T20:09:44.753 回答