sql-server - SQL Server SQLCLR 函数在从一个 DB 复制到另一个 DB 后收到参数错误
问题描述
我正在尝试将发送电子邮件程序集从一个数据库复制到另一个数据库。我单击脚本程序集作为创建并在新数据库中创建它。
当我尝试在较新的数据库中发送带有该功能的电子邮件时,我收到以下错误:
参数“fileName”不能为空字符串。参数名称:文件名
如何跨数据库复制程序集?
一些细节:
- 两个数据库都在同一个实例上
- 两个数据库都属于同一个登录名
- 使用 SQL Server 2016
UNSAFE
程序集在两个数据库中都标记为- 两个数据库都已
TRUSTWORTHY
启用 - T-SQL 包装对象是一个标量函数/UDF
- 两个数据库中的函数调用方式相同
解决方案
如何跨数据库复制程序集?
到目前为止,我还没有看到这是一个 SQLCLR 问题。您清楚地复制了程序集和 T-SQL 包装器对象,否则您将收到 T-SQL 错误而不是 .NET 错误。
我单击脚本程序集作为创建并在新数据库中创建它。
假设您编写了 T-SQL 包装器对象的脚本并且您收到与输入参数相关的错误,您可能会遇到导致NVARCHAR
参数默认值无法正确编写脚本的错误:
SSMS 脚本 CLR 存储过程 NVARCHAR 参数 NULL 默认为 N''(空字符串)
在新旧数据库中执行以下操作,以确保所有参数定义相同,包括任何潜在的默认值(密切注意具有1
for的行[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 信息
推荐阅读
- javascript - 我试图在 Electron.js 中单击按钮时打开新窗口,但未捕获 ReferenceError: require is not defined
- c - 我在使用 strcmp 时遇到问题。由于某种原因,它检测到了错误的单词,但仍然继续使用代码
- powershell - 尝试在列表上使用 Import-Clixml 时
,返回值为 System.Object - javascript - 作为有序树的产品选择
- android - 就地修改 MediaStore 的外部图像文件的最佳做法是什么?
- javascript - JavaScript 递归识别最后一个元素
- python - 如何使用组均值填充 df 中的 nan 值?
- swift - 具有可观察对象的类已被用于未初始化
- python - Kivy ImageButton 填满整个屏幕
- c++ - 错误 C7510:“节点”:依赖模板名称的使用必须以“模板”为前缀。还有其他解决方案吗?