使用Prisma+NextJS连接SQL Server创建记录报错求助
解决Prisma连接SQL Server时create操作报"String or binary data would be truncated"的问题
问题根源
错误并非来自description字段,而是那些配置了SQL函数默认值的字段(比如created_by、last_updated_by、create_loc)。当前Prisma Schema里的@default("[dbo].[FS_USERNAME]()")是客户端层面的默认值逻辑,Prisma会直接把这个字符串字面量传给数据库,但这些字段的长度限制远小于该字符串的实际长度:
- 比如
created_by是@db.Char(8),但"[dbo].[FS_USERNAME]()"字符串长度为20,插入时必然触发数据截断报错。
解决方案
将这些客户端层面的默认值改为数据库级默认值,让数据库自行执行已定义的默认约束,而非让Prisma传递字符串字面量:
修改你的Prisma模型对应字段的定义:
model TR_PHONE_TYPE { id Int @id(map: "PK_TR_PHONE_TYPE") @default(autoincrement()) description String @db.VarChar(30) // 改用@db.Default让数据库处理默认函数 created_by String? @db.Default("[dbo].[FS_USERNAME]()") @db.Char(8) @db.Map("created_by") create_dt DateTime? @db.Default(now()) @db.DateTime @db.Map("create_dt") last_updated_by String? @db.Default("[dbo].[FS_USERNAME]()") @db.Char(8) @db.Map("last_updated_by") last_update_dt DateTime @db.Default(now()) @db.DateTime @db.Map("last_update_dt") create_loc String? @db.Default("[dbo].[FS_LOCATION]()") @db.VarChar(16) @db.Map("create_loc") inactive String @db.Default("N") @db.Char(1) @db.Map("inactive") control_group Int @db.Default(-1) @db.Map("control_group") tele_ind String @db.Default("Y") @db.Char(1) @db.Map("tele_ind") de_ind String? @db.Char(1) TR_CONTROL_GROUP TR_CONTROL_GROUP @relation(fields: [control_group], references: [id], onUpdate: NoAction, map: "FK_TR_PHONE_TYPE_TR_CONTROL_GROUP_control_group") T_PHONE T_PHONE[] }
关键说明
@db.Default(...):告诉Prisma使用数据库已有的默认约束,不会将括号内的内容当作字面量传递,而是让数据库执行对应的函数或使用预设默认值。@db.Map(...):确保模型字段与数据库中的列名正确映射(若字段名与列名一致可省略,但保留能避免潜在映射问题)。
验证步骤
- 修改Schema后,执行
npx prisma generate更新Prisma客户端。 - 重新执行create操作,此时Prisma会让数据库自行处理默认值,不会传递超长的函数字符串,截断错误即可消除。
- 可开启Prisma的SQL日志确认执行逻辑:在
schema.prisma的datasource块中添加log = ["query"],查看终端输出的INSERT语句,会发现不再包含created_by = '[dbo].[FS_USERNAME]()'这类错误赋值逻辑。
内容的提问来源于stack exchange,提问作者wiljago
相关产品推荐
相关产品推荐

