从 Web 执行过程创建的记录少于从 SQL 管理工作室运行


Executing procedure from web create less records than running from SQL Management Studio

在MS SQL上,我有将记录插入表的过程CM_Export。当我直接从 SQL 管理工作室 ( EXEC dbo.CM_Export 'DB1', 'DB2', 1 ) 运行它时,它会插入 80 行。但是当我从 web 运行它时,它只插入 20 行。在这两种情况下,都需要 1 秒。在网络上,我尝试两种方式:

1)

    $sql = "EXEC dbo.CM_Export 'DB1', 'DB2', 1";
sqlsrv_query($conn, $sql);

2)

  $tsql = "{call CM_Export(?, ?, ?)}";
$params = array(array("DB1", SQLSRV_PARAM_IN),
 array("DB2", SQLSRV_PARAM_IN),
 array(1, SQLSRV_PARAM_IN)
);
$stmt = sqlsrv_prepare($conn, $tsql, $params);    
if($stmt) {    
 echo "Statement prepared.'n";    
} else {    
 echo "Error in preparing statement.'n";    
 die( print_r( sqlsrv_errors(), true));    
}    
if(sqlsrv_execute($stmt)) {    
 echo "Statement executed.'n";
} else {
 echo "Error in executing statement.'n";
 die(print_r(sqlsrv_errors(), true));
}
sqlsrv_free_stmt($stmt);

未发生错误。我尝试在探查器中捕获运行的内容以及何时将其复制到管理工作室,因此过程插入 80 行和 web 20。当我添加到存储过程 TRANS 时,因此从 web 运行不会添加行。但是没有错误 - 从管理工作室运行再次正常。我也尝试跟踪日志,有:

退出 SQLExecDirectW,返回代码为 0 (SQL_SUCCESS)

当我进行多次刷新(Ctrl + R 过程中没有 TRANS)时,因此从前 20 行过程添加另一行,我能够创建大约 40 行。所以问题似乎在某个超时。但是将超时参数添加到脚本中并非没有效果。

sqlsrv_query($conn, $sql, array(), array('QueryTimeout' => 100))

在跟踪日志中,我还发现:

WCHAR * 0x50418B34 [-3]

谷歌说这是使用SQL的ODBC驱动程序的samo问题。我使用 SQL 2008 R2 64b。

所以我

找到了解决方案 - 将 SET NOCOUNT ON 添加到存储过程中!

您是否尝试过删除sqlsrv_free_stmt? 可能是在工作完成之前释放了语句。

脚本执行完毕后,仍应清理该语句。