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

使用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(...):确保模型字段与数据库中的列名正确映射(若字段名与列名一致可省略,但保留能避免潜在映射问题)。

验证步骤

  1. 修改Schema后,执行npx prisma generate更新Prisma客户端。
  2. 重新执行create操作,此时Prisma会让数据库自行处理默认值,不会传递超长的函数字符串,截断错误即可消除。
  3. 可开启Prisma的SQL日志确认执行逻辑:在schema.prisma的datasource块中添加log = ["query"],查看终端输出的INSERT语句,会发现不再包含created_by = '[dbo].[FS_USERNAME]()'这类错误赋值逻辑。

内容的提问来源于stack exchange,提问作者wiljago

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:13:16