insert我在 PHP循环中生成 SQL语句for。
生成的 SQL 字符串是大量单独的 SQL 语句,如下所示:
INSERT INTO tbl VALUES(1,2,3);
INSERT INTO tbl VALUES(4,5,6);
INSERT INTO tbl VALUES(7,8,9);
ETC...
然后我执行:
$InsertResult = sqlsrv_query($conn, $InsertSQL);
问题是只有前 312 条语句被执行,而不是完整的 2082 行(只有 312 行被插入到表中)。
当我将$InsertSQL变量输出到 JavaScript 控制台,然后在 SSMS 中手动执行它时,它完美地工作并插入了所有 2082 行。只有当我运行$InsertSQL变量时sqlsrv_query它才不会完成。
我也没有收到任何错误,并且查询结果返回 true,如下行所示:
if(!$InsertResult) die('Problem with Insert query: ' . $InsertSQL);
当我搜索此问题的解决方案时,我看到(尽管 PHP 手册站点中未提及)sqlsrv_query显然对变量有字符串字符限制$SQL(大约 65k 个字符)。
请在此处查看另一篇 StackOverflow 文章: sqlsrv_query 上的 sql 变量的长度限制?
我认为这是问题所在,因此创建了一个较短版本的字符串(通过仅添加我实际想要导入的列值)。然而,这个短得多的版本仍然只插入前 312 行!所以现在看来这与最大字符串长度无关。事实上,如果是的话,我应该只得到大约 250 行(在 250 条语句之后我大约有 65k 个字符)。
我也可以insert单独执行每个语句,但这当然需要更长的时间。在我的测试中,这样做需要 90 秒左右,而在 SMSS 中手动运行组合语句只需要大约 40 秒。
请注意,我还查看了 SQL Server 的批量插入,但是我无法将文件发送到安装了 SQL Server 的机器(SQL Server 和 Web 服务器位于不同的计算机上)。据我了解,这消除了这种可能性。
非常感谢任何帮助,因为我什至无法弄清楚是什么限制了我,更不用说修复它了,我不想一次只执行一行。
慕虎7371278