長いストアド プロシージャがありますが、その実行ステータスを知るにはどうすればよいですか? 50% 完了など。いろいろ検索しましたが、満足のいく結果は得られませんでした。それが不可能であることを願っています。MS SQL Server 2008 を使用しています。利用可能 ?
4 に答える
以下を使用できます。
RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT
このステートメントの直後にメッセージを出力します。(エラー メッセージは生成されません)。
いいえ、少なくともあなたが説明した形式では利用できません。これは、ストアドプロシージャが内部で何をしなければならないか(他のストアドプロシージャを呼び出す場合はどうなるか)と、それを実行しようとするまでにかかる時間の両方を知ることが非常に難しいためです。
確かに、あなたはprocを調べてそれがするのを見ることができますSELECT * FROM [TableName]
ただし、テーブルのサイズ、返されるデータ型、ディスクアクセス速度、クエリがキャッシュされているかどうかなどを知る必要があります。
次に、別のプロセスが予期せずレコードをロックし、通常よりも時間がかかる場合はどうなりますか?そのロックがどのくらいの期間保持されるかわからないので、未知の変数(時間)のパーセンテージをどのように計算しますか?
あなたができる最善のことは、メッセージにprint
メッセージを送るか、電子メールを送信するか、各個別のステップの後にテーブルにログインするために、procに「チェックポイント」を置くことです。
print getdate()
print 'Selecting from [Users]'
Select * from [Users]
print getdate()
print 'Selecting from [Clients]'
Select * from [Clients]
print getdate()
print 'Finished'
.NET クライアント アプリケーションを使用している場合は、C# で次の構文を使用して、サーバーから送信されたおおよその進行状況メッセージを受信できます。
using (SqlConnection conn = new SqlConnection(...))
{
conn.FireInfoMessageEventOnUserErrors = true;
conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
using (SqlCommand comm = new SqlCommand("dbo.sp1", conn)
{ CommandType = CommandType.StoredProcedure })
{
conn.Open();
comm.ExecuteNonQuery();
}
}
static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
// Process received message
}
サーバー側のメッセージは、以前の回答の 1 つで Janis が説明したように送信できます。
RAISERROR('33%%..', 10, 0) WITH NOWAIT