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

使用PHP向SQL Server插入多条记录报错,寻求解决方法

解决SQL Server多行INSERT语法错误问题

看起来你遇到的是SQL Server批量插入时的语法报错,我帮你拆解一下问题和对应的解决思路:

先排查核心原因

你写的多行VALUES插入语句,在SQL Server 2008及以上版本里是完全合规的,但报错Msg 103010, Level 16, State 1通常指向两种情况:

  1. 你的SQL Server版本不支持多行VALUES语法:SQL Server 2008才引入了这种批量插入特性,如果你用的是2005或更早版本,这种写法会直接触发语法错误。
  2. PHP代码中语句拼接有隐藏问题:比如字符串换行导致的语法断裂、引号未转义,或者不小心多打/漏了符号,使得实际发送给数据库的语句是残缺的。

针对性解决方案

方案1:适配低版本SQL Server(2005及更早)

如果你的数据库版本不支持多行VALUES,改用UNION ALL的方式实现批量插入:

INSERT INTO [BP].[users](id,username,email,contact,status)
SELECT '12','sujata','td@hh.com','8588841506','0'
UNION ALL
SELECT '13','sonali','th@wq.com','7894561231','0'
UNION ALL
SELECT '14','khushboo','tr@lp.com','7894561230','0'

或者在PHP里循环遍历每条数据,执行单条INSERT语句(兼容性拉满,只是效率略低)。

方案2:修复PHP语句拼接问题

先把PHP里的完整$query语句打印出来,复制到SSMS(SQL Server管理工具)里直接执行:

  • 如果SSMS里执行正常,说明是PHP拼接时的问题:检查是否有多余的逗号、引号未转义,或者换行导致的语法断裂。
  • 如果SSMS里也报错,那大概率是版本问题,直接用方案1的写法即可。

方案3:推荐使用参数化查询(更安全+避免语法坑)

不管数据库版本如何,都建议用参数化查询来批量插入——既能避免SQL注入风险,又能彻底解决拼接语法错误的问题。这里给你一个用SQLSRV扩展实现的示例:

<?php
// 连接数据库
$serverName = "你的服务器名";
$connectionInfo = array("Database"=>"你的数据库名", "UID"=>"用户名", "PWD"=>"密码");
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// 准备要插入的用户数据
$userData = [
    ['12','sujata','td@hh.com','8588841506','0'],
    ['13','sonali','th@wq.com','7894561231','0'],
    ['14','khushboo','tr@lp.com','7894561230','0']
];

// 生成参数占位符
$placeholders = implode(',', array_fill(0, count($userData), '(?, ?, ?, ?, ?)'));
$query = "INSERT INTO [BP].[users](id,username,email,contact,status) VALUES $placeholders";

// 整理所有参数
$params = [];
foreach ($userData as $user) {
    $params = array_merge($params, $user);
}

// 预处理并执行语句
$stmt = sqlsrv_prepare($conn, $query, $params);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

if (sqlsrv_execute($stmt) === false) {
    die(print_r(sqlsrv_errors(), true));
}

echo "批量插入成功!";
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

额外提醒

检查一下users表的字段类型:比如id如果是INT类型,不需要用单引号包裹值(直接写12而不是'12'),虽然SQL Server会自动转换类型,但匹配字段类型能避免潜在的转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:11