SQL 服务器 SQLCLR 函数从一个数据库复制到另一个数据库后收到参数错误
SQL Server SQLCLR function receives parameter error after copying from one DB to another
我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本程序集作为创建并在新数据库中创建它。
当我尝试使用较新数据库中的函数发送电子邮件时,出现以下错误:
The parameter 'fileName' cannot be an empty string. Parameter name: fileName
如何跨数据库复制程序集?
一些细节:
- 两个数据库在同一个实例上
- 两个数据库都属于同一个登录名
- 使用 SQL 服务器 2016
- 程序集在两个数据库中都被标记为
UNSAFE
- 两个数据库都已启用
TRUSTWORTHY
- T-SQL 包装器对象是一个标量函数/UDF
- 函数在两个数据库中的调用方式相同
How can I copy the assembly across databases?
到目前为止,我还没有看出这是一个 SQLCLR 问题。您清楚地复制了程序集和 T-SQL 包装器对象,否则您将收到 T-SQL 错误而不是 .NET 错误。
I clicked on script assembly as create to and created it in the new db.
鉴于您编写了 T-SQL 包装器对象 并且 您收到与输入参数相关的错误,您可能 运行遇到一个导致 NVARCHAR
参数的默认值无法正确编写脚本的错误:
SSMS scripting CLR stored procedure NVARCHAR parameter NULL default as N'' (empty string)
在旧数据库和新数据库中执行以下操作以确保所有参数定义相同,包括任何潜在的默认值(密切注意 [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 Info
我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本程序集作为创建并在新数据库中创建它。
当我尝试使用较新数据库中的函数发送电子邮件时,出现以下错误:
The parameter 'fileName' cannot be an empty string. Parameter name: fileName
如何跨数据库复制程序集?
一些细节:
- 两个数据库在同一个实例上
- 两个数据库都属于同一个登录名
- 使用 SQL 服务器 2016
- 程序集在两个数据库中都被标记为
UNSAFE
- 两个数据库都已启用
TRUSTWORTHY
- T-SQL 包装器对象是一个标量函数/UDF
- 函数在两个数据库中的调用方式相同
How can I copy the assembly across databases?
到目前为止,我还没有看出这是一个 SQLCLR 问题。您清楚地复制了程序集和 T-SQL 包装器对象,否则您将收到 T-SQL 错误而不是 .NET 错误。
I clicked on script assembly as create to and created it in the new db.
鉴于您编写了 T-SQL 包装器对象 并且 您收到与输入参数相关的错误,您可能 运行遇到一个导致 NVARCHAR
参数的默认值无法正确编写脚本的错误:
SSMS scripting CLR stored procedure NVARCHAR parameter NULL default as N'' (empty string)
在旧数据库和新数据库中执行以下操作以确保所有参数定义相同,包括任何潜在的默认值(密切注意 [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 Info