2

Web ページにグリッドを表示する必要があります。データは、ストアド プロシージャを介して 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   
4

3 に答える 3

2

FROM MyTable ORDER BY CASE WHEN @ColSort = 'ABC' THEN ABC ....

より徹底した説明

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

于 2009-05-01T09:21:12.417 に答える
0

おそらく動的 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
于 2009-05-01T09:21:25.880 に答える
0

あなたが説明したように、他の投稿、動的SQL、またはCASEステートメントの順序に完全に同意します。

ただし、余談ですが、使用しているフレームワークの残りの部分を見てください。そのasp.net 3.5の場合、組み込みのグリッドとlinqは、ほとんど手間をかけずにこれらすべてを実行します。http://www.asp.net/learnを見てみてください。

于 2009-05-01T09:23:43.860 に答える