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

问题描述 投票:1回答:1

我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击了“创建脚本”,然后在新数据库中创建了它。

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

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

如何在数据库之间复制程序集?

一些细节:

  • 两个DB都在同一实例上
  • 两个数据库都属于同一登录名
  • 使用SQL Server 2016
  • 程序集在两个DB中都标记为UNSAFE
  • 两个DB都启用了TRUSTWORTHY
  • T-SQL包装器对象是标量函数/ UDF
  • 在两个数据库中以相同的方式调用函数
sql-server parameters ssms sqlclr generate-scripts
1个回答
1
投票

如何在数据库之间复制程序集?

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

我以创建脚本的方式单击了脚本程序集,并在新数据库中创建了它。

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

SSMS scripting CLR stored procedure NVARCHAR parameter NULL default as N'' (empty string)

在新旧数据库中执行以下操作,以确保所有参数定义都相同,包括任何潜在的默认值(请密切注意1的行为[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包装对象,CREATE更改为ALTER)。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.