Microsoft sqlsrv for PHP驱动程序对查询字符串长度有限制吗?


Does Microsoft sqlsrv driver for PHP has limitation on query string length?

我使用php 5.5.7和sqlsrv驱动程序从microsoft

我试图用单个sql查询插入多行,字符串大小约1MB但是SQL server只插入了1500行,只有220k的查询字符串,并给出了错误的语法,似乎被截断。

我从来没有遇到过这个问题的mssql驱动程序。

我做错什么了吗?

我不知道"限制"是什么,但我有同样的问题,只是在将查询写入文件之前使用4KB作为限制,然后使用sqlcmd命令行工具将该文件导入SQL Server。

似乎没有任何方法可以确定真正的极限是什么或调整它。

    if(strlen($query) > 4096) {
        $fname = time() . rand(0,10000) . '.txt';
        $fp = fopen($fname, 'w');
        fwrite($fp, $query);
        fclose($fp);
        $output = [];
        exec('sqlcmd -U' . MSSQL_USER . ' -P"' . MSSQL_PASS . '" -S' . MSSQL_HOST . ' -i' . $fname, $output);
        $returnval['exec'] = implode(PHP_EOL, $output);
        $returnval['error'] = '';
        unlink($fname);
    } else { sqlsrv_query(...); }

如果你使用一个SQL Server INSERT语句的值列表太长(限制是1000行SQL 2008 R2,但你的版本的SQL Server可能在这方面是不同的),你会得到一个错误。您需要将单个INSERT分解为多个INSERT,且不超过VALUES的最大数量,即:

INSERT INTO tbl_x (RowNumber)
VALUES (1),
       (2),
       ...
       (999),
       (1000);
INSERT INTO tbl_x (RowNumber)
VALUES (1001),
       (1002),
       ...
       (1999),
       (2000);

如果使用PDO,可以尝试使用单个参数化的预处理语句,并循环遍历分配参数数组的各个insert。这避免了长度问题,也避免了必须首先创建和传递一个巨大的字符串。看起来这也比重弦更好。

如果我理解得好,你正试图执行字符串查询,即存储过程。如果我没有错的话,它取决于你声明的包含该查询的字符串的长度。请添加更多细节/代码