用于PHP的Microsoft sqlsrv驱动程序是否对查询字符串长度有限制?

时间:2014-03-10 12:34:54

标签: php sql sql-server

我正在使用来自microsoft的php 5.5.7和sqlsrv驱动程序

我尝试使用单个sql查询插入多行,其中字符串大小约为1MB 但SQL服务器只插入了1500行,这只是220k的查询字符串,并且提供了一个错误的语法似乎被截断的错误。

我从未遇到过使用mssql驱动程序的这个问题。

我做错了吗?

4 个答案:

答案 0 :(得分:1)

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

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

    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(...); }

答案 1 :(得分:0)

如果您使用的单个SQL Server INSERT语句的值列表太长(SQL 2008 R2中的限制为1000行,但您的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);

等等。

答案 2 :(得分:0)

如果使用PDO,您可以尝试单个参数化预准备语句,并循环分配参数数组的各个插入。这避免了长度问题,并且必须首先创建并传递一个巨大的字符串。似乎比重型弦也更好。

答案 3 :(得分:0)

如果我理解得很好,那么您正尝试从存储过程执行字符串查询。如果我没有错,那么它取决于包含该查询的声明字符串的长度。 请添加更多详细信息/代码。