Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microsoft sqlsrv PHP驱动程序对查询字符串长度有限制吗?_Php_Sql_Sql Server - Fatal编程技术网

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

Microsoft sqlsrv PHP驱动程序对查询字符串长度有限制吗?,php,sql,sql-server,Php,Sql,Sql Server,我正在使用微软的PHP5.5.7和sqlsrv驱动程序 我尝试使用单个sql查询插入多行,该查询的字符串大小约为1MB 但是SQLServer只插入了1500行,这是仅有220k的查询字符串,并且给出了一个错误,错误的语法似乎被截断了 我从来没有遇到过mssql驱动程序的这个问题 我做错了什么吗?如果使用单个SQL ServerINSERT语句,其中的值列表太长(SQL 2008 R2中的限制为1000行,但您的SQL Server版本可能在这方面有所不同),则会出现错误。您需要将一个INSER

我正在使用微软的PHP5.5.7和sqlsrv驱动程序

我尝试使用单个sql查询插入多行,该查询的字符串大小约为1MB 但是SQLServer只插入了1500行,这是仅有220k的查询字符串,并且给出了一个错误,错误的语法似乎被截断了

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


我做错了什么吗?

如果使用单个SQL Server
INSERT
语句,其中的值列表太长(SQL 2008 R2中的限制为1000行,但您的SQL Server版本可能在这方面有所不同),则会出现错误。您需要将一个
INSERT
拆分为多个
INSERT
s,其值不超过
值的最大数目,即:

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

依此类推。

如果使用PDO,您可以尝试使用单个参数化的prepared语句,并通过分配参数数组的各个插入循环。这就避免了长度问题,并且首先必须创建并传递一个巨大的字符串。看起来这比那根粗绳子的伸缩性更好

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

我不知道“限制”是什么,但我遇到了同样的问题,在将查询写入文件,然后使用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(...); }

我们能看一下代码吗?