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

在Prisma中使用自定义表作为参数执行存储过程报错求助

问题分析与修复方案

错误原因

  1. Prisma参数化处理异常:直接拼接values数组为SQL字符串时,$queryRaw会将拼接内容识别为单个参数,导致SQL语法解析报错(@P1是Prisma自动生成的参数占位符,因位置错误触发语法问题)。
  2. 表变量使用逻辑错误:声明表变量@input_target后,插入语句却指向物理表dbo.master_input,应该将数据插入到表变量中。
  3. 存储过程参数名不匹配:存储过程定义的参数是@input_master_target,但调用时传入的参数名是@input_target,二者不对应。
  4. SQL注入风险:直接拼接字符串生成SQL存在安全漏洞,必须采用参数化查询方式。

修复后的Node.js代码

const { Prisma } = require('@prisma/client');
const today = new Date();

// 构造参数化的插入值片段
const valueParams = masterInputEntity.map(record => 
  Prisma.sql`(${record.id}, ${record.code}, ${record.email}, ${record.first_name}, ${record.last_name}, ${record.latest_status}, ${record.additional_information}, ${today})`
);

const result = await Prisma.$queryRaw`
  DECLARE @input_target dbo.master_input;
  INSERT INTO @input_target (id, code, email, first_name, last_name, latest_status, additional_information, date_added)
  VALUES ${Prisma.join(valueParams)};
  EXEC dbo.insert_master_entries @input_master_target = @input_target;
`;

关键修正点

  • 参数化拼接SQL:使用Prisma.sql和Prisma.join处理批量插入的values,既解决语法错误,又避免SQL注入风险。
  • 表变量插入修正:将数据插入到声明的表变量@input_target中,而非物理表dbo.master_input。
  • 参数名匹配:调用存储过程时使用正确的参数名@input_master_target,与存储过程定义保持一致。

补充说明

确保dbo.master_input是用户定义表类型(不是物理表),若未创建需先执行以下SQL:

CREATE TYPE dbo.master_input AS TABLE (
  id INT, -- 根据实际数据类型调整
  code VARCHAR(50),
  email VARCHAR(100),
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  latest_status VARCHAR(20),
  additional_information VARCHAR(255),
  date_added DATETIME
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:35:06