PHP 和 SQLSRV 没有插入它应该插入的所有行

Posted

技术标签:

【中文标题】PHP 和 SQLSRV 没有插入它应该插入的所有行【英文标题】:PHP and SQLSRV isn't inserting all the rows it should 【发布时间】:2013-10-31 18:24:54 【问题描述】:

我正在使用 php 5.5 并连接到 MS SQL 数据库。连接按预期工作。我正在尝试进行大规模插入(大约 2000 行)。我没有使用 PHP 运行 2000 条 INSERT 语句,而是发送如下查询:

DECLARE @count INT
SET @count = 0
WHILE(@count < 2000)
BEGIN
INSERT INTO Table (Field1, Field2)
VALUES ('data1', 'data2')
SET @count = (@count + 1)
END

当我将此查询直接插入 SQL Server Mangement Studio 时,它会按预期插入 2000 行。当我像这样通过 PHP 运行查询时:

$connectInfo = array ("UID"=>'user',"PWD"=>'@pass',"Database"=>"database", "ReturnDatesAsStrings"=>true);
$link = sqlsrv_connect("dataserver",$connectInfo);

$query = "DECLARE @count INT 
SET @count = 0  
WHILE(@count < 2000) 
BEGIN 
INSERT INTO License (Field1, Field2) 
VALUES('data1','data2') 
SET @count = (@count + 1) 
END";

if(!$foo = sqlsrv_query($link,$query)) 
  die(print_r(sqlsrv_errors(), true));
else
  die("hooray beer time!");

这只会在表中插入 524 行,而不是预期的 2000 行(有时它是 309 行,X 行,它不稳定)。它没有出错,我得到“万岁啤酒时间!”每次脚本运行后。默认情况下, sqlsrv_query() 函数没有时间限制,我想。有没有人遇到过这样的事情?这让我很困惑。

【问题讨论】:

这是有效的 sql。如果是连接/命令超时或缓冲区大小问题,您将收到异常。我将首先创建一个测试存储过程并粘贴您的 sql。然后把你的内联sql改成“EXEC TEST_PROC”看看有没有区别:( 【参考方案1】:

啊,似乎在 While 循环中的每次插入之后,SQL 都会返回一小行 Text,上面写着 (1) 行受影响(或类似的东西)。通过以下方式关闭此功能:

SET NOCOUNT ON

已解决此问题。谢谢大家!

【讨论】:

以上是关于PHP 和 SQLSRV 没有插入它应该插入的所有行的主要内容,如果未能解决你的问题,请参考以下文章

获取最后一个插入 id sqlsrv

将日期时间从 C# 插入到 SqlSrv

Sqlsrv 没有读取存储过程的响应

无法使用PDO SQLSRV将数据插入SQL db

SQLSRV 不获取所有行

在 PHP 中选择并插入 BLOB 数据