在 MS SQL 上,我有将记录插入表的过程 CM_Export。当我直接从 SQL Management Studio ( EXEC dbo.CM_Export 'DB1', 'DB2', 1
) 运行它时,它会插入 80 行。但是当我从网络上运行它时,它只插入了 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);
没有发生错误。我尝试在探查器中捕获运行的内容以及将其复制到 Management Studio 时,因此过程插入 80 行并从 web 20。当我添加到存储过程 TRANS 时,因此从 web 运行不会添加任何行。但没有错误 - 从 Management Studio 运行再次正常。我也尝试过tracelog,有:
退出 SQLExecDirectW 并返回代码 0 (SQL_SUCCESS)
当我进行多次刷新(程序中没有 TRANS 的 Ctrl + R)时,所以从前 20 行过程中添加另一行,我可以创建大约 40 行。所以似乎问题出在了一些超时中。但是在脚本中添加超时参数没有任何效果。
sqlsrv_query($conn, $sql, array(), array('QueryTimeout' => 100))
在跟踪日志中,我还发现:
WCHAR * 0x50418B34 [-3]
谷歌说这是使用 SQL 的 ODBC 驱动程序的问题。我使用 SQL 2008 R2 64b。