手順

2011-01-12 17 views
0

格納されているSQL Serverからの行や変数を返すために、どのようにうまくいけば、これは簡単です。私は約500以上の行を返すストアドプロシージャを最適化しています。私の計画は、取得する行がなくなるまでバッチで行を戻すことです。手順

例えば、私が買ってあげる行0-49 - そしてその後、50-99、100から149、というように..私は、次のSQLコードを使用して、これを達成しました

私はこのSPを実行すると
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 

、私は単にrowstartとrowendの値を渡すと、それは私が完璧にしたい行の範囲を返します。

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

50行が返されるという初期クエリを返すと、503個のTOTALテーブル行があることがわかったら、簡単な数式(503/50)を実行して、何回呼び出しする必要があるかを把握できますSP。どんな助けもありがとう!

+0

からそれをしたい場合は、これは、ページング方式の必要性である。このようなものでしょうか?つまり、必ずしも503行は必要ないでしょうか? –

+0

"more"ボタンが当てはまるかどうかだけ知りたいのであれば、 'n'を表示したいときは' n + 1'行を要求することができます。あなたが得る 'のn + 1 'は、あなただけの最初の' N 'を示し、あなたがより多くのあることがわかっている場合は、あなたが 'n + 1 'よりも少なくなると、それらをすべて表示し、それ以上はないことを知っています。余分な行を取得するのは、結果セットを作成するための計算コストをすでに支払った後は、一般的にかなり安いです。 –

答えて

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 
0

あなたは出力パラメータの聞いたことがありますか?あなたは、OUTPUTパラメータで行数を格納し、ストアドプロシージャは、行を返す可能性があります。

詳細情報を見つけることができますhere