通过链接服务器带参数调用远程SQL自定义函数报错排查
链接服务器调用自定义UDF的参数错误修复
我有个自定义函数AddBizDays,用来给日期加工作日,本地跑没问题,但通过链接服务器调用就报错。函数定义:
CREATE FUNCTION [dbo].[AddBizDays] (@Day SMALLINT, @StartDate DATE) RETURNS SMALLDATETIME
试了两种调用方式,都收到错误提示:Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'
方式一:
EXEC [Server1].DB1.dbo.sp_executesql N'SELECT [dbo].[AddBizDays](@Day, @StartDate)', 'N@Day smallint, @StartDate date', '@Day = 1', '@StartDate = ''2024-10-01'''
方式二:
EXEC [Server1].DB1.dbo.sp_executesql N'SELECT [dbo].[AddBizDays](@Day, @StartDate)','N@Day smallint, @StartDate date', '@Day = 1, @StartDate = ''2024-10-01'''
问题出在哪?
这俩写法都有参数传递的格式错误:
- @params的类型不对:你把
N写在引号里了,导致'N@Day smallint, @StartDate date'被当成普通字符串,而sp_executesql要求@params必须是Unicode类型(nchar/nvarchar/ntext),正确的写法是把N放在引号外面,声明这是Unicode字符串。 - 参数值传递格式错了:方式一的
'@Day = 1'、方式二的合并字符串都是错误的,sp_executesql的参数值不需要用字符串包裹赋值语句,直接传值或者用@参数名=值的形式就行。
修正后的正确调用
方式一:指定参数名传递
EXEC [Server1].DB1.dbo.sp_executesql N'SELECT [dbo].[AddBizDays](@Day, @StartDate)', N'@Day smallint, @StartDate date', -- N在引号外,声明Unicode类型 @Day = 1, @StartDate = '2024-10-01'
方式二:按顺序传递参数
EXEC [Server1].DB1.dbo.sp_executesql N'SELECT [dbo].[AddBizDays](@Day, @StartDate)', N'@Day smallint, @StartDate date', 1, '2024-10-01'
核心要点
- 必须保证
@params参数是Unicode类型,所以前缀N一定要放在字符串常量的外面,不能包在引号里。 - 参数值不能用字符串包裹赋值表达式,要么按顺序直接传值,要么用
@参数名=值的形式逐个传递,别把多个参数合并成一个字符串。
内容的提问来源于stack exchange,提问作者ichachan
相关产品推荐
相关产品推荐

