2016-12-25 13 views
2

私は、ストアドプロシージャを使用して、ストアドプロシージャからデータを早期に返し、その後処理を続行できるようにしたいと考えています。T-SQLは結果を返して処理を続行します

は、基本的には今、私はそうのようなものがあります。

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
    @someargshere 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    UPDATE lastAccessedTime = GETUTCDATE() WHERE based on someargs; 
    SELECT some fields WHERE based on someargs; 
END 

を私は実際にlastAccessedTimeがSELECT声明何のためにあるのかを気にしないが、私は、行の結果セットを返すために発見した唯一の方法はにあります最後にSELECTを実行してください。私が見つけたすべてのドキュメントでは、RETURNは整数表現しか取っていないと言われています。結果を早期に返信して、アプリケーションに可能な限り速い応答時間を得ることができるようにして、サーバーに更新を依頼しながら処理を続けることができます。だから、私は何かをしたいと思っています

SELECTT..... 
RETURN results to app 
UPDATE after connection has sent results 

これは可能でしょうか、それとももっと良いアプローチですか?

+0

SPで達成しようとしていることははっきりしませんが、一連の行に新しいlastAccessedTimeを設定し、それらの行からデータを返すと仮定した場合、パフォーマンスを向上させるには影響を受けた行のデータを一時テーブルに保存するために、 'UPDATE'に[' OUTPUT'](https://msdn.microsoft.com/en-us/library/ms177564.aspx)句を追加します。テンポラリテーブルからの 'SELECT'は結果を返します。現在の設計では、トランザクションを追加せずに、別のユーザが 'UPDATE'と' SELECT'の間で行を更新することができます。 'OUTPUT'は排除します。 – HABO

答えて

6

いいえ、あなたはそれが逐次処理のために行うことはできませんと思います。さらに、それを実行することができても、実際に更新されたデータではなく、古いデータを読み取ることになります。 DIRTY READとも呼ばれます。

最初に投稿した内容は正しいことです。最初にUPDATEを実行し、次にSELECTを実行してアプリケーションに戻ります。あなたの手続きは、処理全体が終了し、部分的にあなたが言っている(あるいは同様にマルチスレッドのプログラミング言語で起こる)わけではないときにのみ返されます。

SELECTUPDATEは、異なるプロシージャ/アドホッククエリで、アプリケーションのプログラミング言語に基づいて(複数のスレッドをサポートしている場合)分離することができますが、テーブルからSELECTが実行され、別のスレッドが実行される2つのスレッドがあります。UPDATEC#の場合は、async - await)を実行できます。おそらくその場合は、TRANSACTION ISOLATION LEVELREAD UNCOMMITTEDに設定する必要があります。

+1

_ "異なるプロシージャ/アドホックでSELECTとUPDATEを分離する_ _ upvoted。 –

+0

私が読んでいるものは私が更新しているものではないので、古いデータを読んでも大丈夫です – csteifel

関連する問題