質問

ウェブページにグリッドを表示する必要があります。データは、ストアドプロシージャを介して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の順序で並べ替える....

より詳細な説明

http://www.extremeexperts.com/sql/articles/CASEinORDER.aspx

他のヒント

動的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 をご覧ください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top