1

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 を使用しています。

4

2 に答える 2

1

だから私は解決策を見つけました -ストアドプロシージャに SET NOCOUNT ON を追加してください!

于 2012-05-24T08:00:52.260 に答える
0

sqlsrv_free_stmt を削除しようとしましたか? 作業が完了する前にステートメントが解放されている可能性があります。

スクリプトの実行が終了したら、ステートメントをクリーンアップする必要があります。

于 2012-05-23T15:18:54.513 に答える