一种实现方法是将整个数据集编码为JSON并在单个查询中发送。有几种不同的方法可以实现这一点。Microsoft的文档此处讨论了其中一种方式。他们在示例中插入了JSON对象(因此,如果您想要批量处理,则应使用对象数组)。
相反,我将使用数组的数组。这会使SQL略微不太容易阅读,但会降低开销。此外,我是通过PDO访问MSSQL,但您也可以轻松地使用sqlsrv。
$stmt = $db->prepare(<<<EndSQL
CREATE TABLE #exampleTable (
A VARCHAR(200),
B VARCHAR(200)
)
INSERT INTO #exampleTable
SELECT * FROM OPENJSON(?) WITH (
A VARCHAR(200) '$[0]',
B VARCHAR(200) '$[1]'
);
DROP TABLE #exampleTable;
EndSQL);
$data = [];
for($i = 0; $i < 100000; $i++) {
$data[] = [
'A' => 'A-val-' . $i,
'B' => 'B-val-' . $i
];
}
$stmt->execute([json_encode($data)]);
这类似于将一堆插入语句粘在同一个语句中的策略,但它允许您使用静态SQL语句,而无论您有多少个插入语句。
INSERT INTO #exampleTable VALUES
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?),
...
如果您使用了这个方法,下一个限制可能会遇到的是内存。在将其发送到 SQL 之前,它会将所有内容加载到 PHP 内存中。有两种方法可以解决这个问题:一次处理大约 10,000 行或者在生成 JSON 的同时将其流式传输到 SQL Server。