MS SQL では、テーブルにレコードを挿入するプロシージャ CM_Export があります。SQL Management Studio ( EXEC dbo.CM_Export 'DB1', 'DB2', 1
) から直接実行すると、80 行が挿入されます。しかし、Web から実行すると、20 行しか挿入されません。どちらの場合も 1 秒かかります。Web では、次の 2 つの方法を試します。
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 から実行しても問題ありません。トレースログも試してみましたが、次のとおりです。
戻りコード 0 (SQL_SUCCESS) で SQLExecDirectW を終了します。
複数の更新を行うと(プロシージャで TRANS なしで Ctrl + R )、最初の 20 行のプロシージャから別の行を追加すると、約 40 行を作成できます。したがって、問題はタイムアウトにあるようです。ただし、タイムアウト パラメータをスクリプトに追加しても効果はありません。
sqlsrv_query($conn, $sql, array(), array('QueryTimeout' => 100))
トレース ログには、次のようなものもあります。
WCHAR * 0x50418B34 [-3]
Google は、これは SQL を使用する ODBC ドライバーの問題であると述べています。SQL 2008 R2 64b を使用しています。