1

在 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。

4

2 回答 2

1

所以我找到了解决方案 -将 SET NOCOUNT ON 添加到存储过程

于 2012-05-24T08:00:52.260 回答
0

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

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

于 2012-05-23T15:18:54.513 回答