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

自定义表值类型调用存储过程遇Msg 8152截断错误,求原因与解决

问题分析与解决方案

错误原因

这个Msg 8152错误我太熟悉了!本质就是你插入的字符串长度超过了目标列的最大允许长度,导致数据被强制截断。具体到你的代码:

  • 你定义的表值类型AccessLevel里,Access列是NVARCHAR(1)——它最多只能存1个字符,但你插入的'dfdfg'是5个字符的字符串,这本身就违反了列的长度限制;
  • 后续存储过程把表值类型的数据插入RoleAccess表时,哪怕RoleAccess的Access列长度足够,表值类型本身的长度限制已经在插入临时表变量时触发了截断错误。

解决步骤

根据你的业务需求,有两种修正方向:

方向1:如果业务需要存储更长的Access值

这种情况要同步调整表值类型和目标表的列长度:

  1. 先确认RoleAccess表中Access列的理想长度(比如业务上最多需要存50个字符,就设为NVARCHAR(50));
  2. 删除旧的表值类型,重新创建适配长度的版本:
DROP TYPE IF EXISTS [dbo].[AccessLevel];
GO
CREATE TYPE [dbo].[AccessLevel] AS TABLE (
    [RoleId] [INT] NULL,
    [Access] [NVARCHAR(50)] NULL, -- 这里改成和RoleAccess.Access一致的长度
    [IsDelete] [BIT] NULL
)
GO
  1. 之后再执行插入和存储过程调用,就不会再触发截断错误了。

方向2:如果Access列本来就只应该存1个字符

那就要修正你插入的数据,把过长的字符串改成符合长度要求的单个字符,比如:

DECLARE @AccessLevel AccessLevel
INSERT INTO @AccessLevel VALUES (4, 'D', 0) -- 改成单个字符
INSERT INTO @AccessLevel VALUES (4, 'D', 0)
EXEC InsertAndUpdateAccessLevel @AccessLevel

内容的提问来源于stack exchange,提问作者mr-dortaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:49:03