質問
ウェブページにグリッドを表示する必要があります。データは、ストアドプロシージャを介してSQL Server 2008から取得されます。 sprocが何千ものレコードを返すので、私は問題なく機能するページングオプションを選択することにしました。ストアドプロシージャでは、次のようなことを行います。
declare @RowIdMin int=10
declare @RowIdMax int=25
select *
from (select Col1, Col2, ROW_NUMBER() over (order by Col1 desc) as RowId
from MyTable ) dt
where RowId BETWEEN @RowIdMin AND @RowIdMax
これは、ユーザーがCol1でソートされたデータを喜んで取得する限り、正常に機能します。レコードセットをどの列でソートする必要があるかが事前にわからない場合、どうすればこれを書き換えることができますか?これは機能しません:
declare @RowIdMin int=10
declare @RowIdMax int=25
@ColSort varchar(100)= 'MyColumn'を宣言します
select *
from (select Col1, Col2, ROW_NUMBER() over (order by <b>@ColSort</b> desc) as RowId
from MyTable) dt
where RowId BETWEEN @RowIdMin AND @RowIdMax
解決
@ColSort = 'ABC' THEN ABCの場合、MyTableの順序で並べ替える....
より詳細な説明
他のヒント
動的SQLがおそらく最善の策です。 row_number()関数のソートオプションを交換します。 executesqlのオプションをパラメーター化することもできます msdn
declare @SQLScript nVarchar(4000)
declare @RowIdMin int=10
declare @RowIdMax int=25
declare @ColSort varchar(100)='MyColumn'
Select @SQLScript = 'select * from (select Col1, Col2, ROW_NUMBER() over (order by ' + @ColSort + 'desc) as RowId from MyTable dt where RowId BETWEEN ' + cast(@RowIdMin as nvarchar(100))+ ' AND ' + cast(@RowIdMax as nvarchar(100))
exec sp_executesql @SQLScript
他の投稿、動的SQL、またはCASEステートメントの順序は、これを行うためのオプションであることに完全に同意します。
ただし、余談ですが、使用している残りのフレームワークを見てください。 asp.net 3.5の場合、組み込みのグリッドとlinqを使用すると、ほとんどすべての作業を行うことなくこのすべてを実行できます。 http://www.asp.net/learn をご覧ください。
所属していません StackOverflow