我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本程序集作为创建对象并在新数据库中创建它。
当我尝试在较新的数据库中发送具有该功能的电子邮件时,出现以下错误:
参数"文件名"不能为空字符串。参数名称:文件名
如何跨数据库复制程序集?
一些细节:
- 两个数据库位于同一实例上
- 两个数据库由同一登录名拥有
- 使用 SQL Server 2016
- 程序集在两个数据库中都标记为
UNSAFE
- 两个数据库都启用了
TRUSTWORTHY
- T-SQL 包装器对象是一个标量函数/UDF
- 函数在两个数据库中的调用方式相同
如何跨数据库复制程序集?
到目前为止,我还没有看到这是SQLCLR问题。您清楚地复制了程序集和 T-SQL 包装器对象,否则您将收到 T-SQL 错误,而不是 .NET 错误。
我单击脚本程序集作为创建对象并在新数据库中创建它。
假设你编写了 T-SQL 包装器对象的脚本,并且收到与输入参数相关的错误,则可能会遇到一个 bug,导致NVARCHAR
参数的默认值无法正确编写脚本:
SSMS 脚本 CLR 存储过程 NVARCHAR 参数 NULL 默认值为 N'' (空字符串(
在旧数据库和新数据库中执行以下命令,以确保所有参数定义都相同,包括任何潜在的默认值(密切注意具有[has_default_value]
1
的行(:
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 包装器对象,或将CREATE
更改为ALTER
(。
请为我上面链接的反馈错误报告投票。谢谢!
有关使用 SQLCLR 的更多信息,请访问: SQLCLR 信息