You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过链接服务器带参数调用远程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'''

问题出在哪?

这俩写法都有参数传递的格式错误:

  1. @params的类型不对:你把N写在引号里了,导致'N@Day smallint, @StartDate date'被当成普通字符串,而sp_executesql要求@params必须是Unicode类型(nchar/nvarchar/ntext),正确的写法是把N放在引号外面,声明这是Unicode字符串。
  2. 参数值传递格式错了:方式一的'@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:33:23