0

うまくいけば、これは簡単です。約500行以上を返すストアドプロシージャを最適化しています。私の計画は、取得する行がなくなるまで行をバッチで返すことです。

たとえば、行0〜49、次に50〜99、次に100〜149というようになります。

私は次のSQLコードを使用してこれを達成しました:

CREATE PROCEDURE [dbo].[mySP]  
@rowstart int,
@rowend int   

AS  

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)

select * from MainQuery where row between @rowstart and @rowend

このSPを実行するときは、rowstartとrowendの値を渡すだけで、必要な行の範囲が完全に返されます。

問題は、各クエリの後に取得する行がもっとあることを知りたいということです。MainQueryブロックの完了後に@@ROWCOUNTを返すことでそれを達成できると思いますが、SPが実行されるたびに返される行の範囲と@@ROWCOUNTの値を取得する方法がわかりません。

50行を返すという最初のクエリを実行するときに、合計503行のテーブル行があることがわかった場合は、簡単な計算(503/50)を実行して、SPを呼び出す必要がある回数を計算できます。どんな助けでも大歓迎です!

4

3 に答える 3

1

出力パラメータを試しましたか?

http://msdn.microsoft.com/en-us/library/ms378108%28v=sql.90%29.aspx

于 2011-01-12T00:16:52.580 に答える
0

他の回答は、ストアドプロシージャから回答を取得する方法を示しています...

@@ROWCOUNTそれがになることを指摘したいと思います@rowend - @rowstart + 1。したがって、最後のページを除いて、50行あります。最後のページでは、たとえばDataTableからクライアントの行数を取得できます。

SQLから必要な場合、必要なのはこのようなものです

WITH MainQuery AS
    (
  HUGE SELECT STATEMENT HERE
)
select * from MainQuery
CROSS JOIN
(SELECT COUNT(*) AS TotalRows FROM MainQuery) MC
 where row between @rowstart and @rowend

また

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)
SELECT * INTO #foo

select * from #foo F
CROSS JOIN
(SELECT COUNT(*) AS TotalRows FROM #foo) M
where F.row between @rowstart and @rowend

また

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)
SELECT * INTO #foo
select * from #foo F where F.row between @rowstart and @rowend

SELECT @outparam = COUNT(*) FROM #foo
于 2011-01-12T05:06:58.673 に答える
0

OUTPUTパラメータについて聞いたことがありますか?行数をOUTPUTパラメータに格納し、ストアドプロシージャに行を返すようにすることができます。

詳細については、こちらをご覧ください

于 2011-01-12T00:17:49.913 に答える