2009-05-01 4 views
2

웹 페이지에 눈금을 표시해야합니다. 데이터는 저장 프로 시저를 통해 SQL Server 2008에서 가져옵니다. sproc이 수천 개의 레코드를 반환 할 때, 나는 잘 작동하는 페이징 옵션을 선택하기로 결정했습니다. 이것은 한 사용자가 COL1으로 분류 데이터를 얻을 행복으로 잘 작동SQL 페이징 정렬

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  

: 저장 프로 시저, 나는 이런 일을한다. 레코드 집합을 정렬해야하는 열을 미리 알지 못하면 어떻게 다시 작성할 수 있습니까? 이 작동하지 않습니다

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 

답변

0

아마도 동적 SQL이 최선의 방법 일 것입니다. row_number() 함수에서 정렬 옵션을 스왑 아웃하십시오. 당신도 나는 완전히 당신이 설명대로이 작업을 수행 할 수있는 옵션은 다른 게시물, 동적 SQL 또는하여 CASE 문 순서에 동의 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 
+0

나는 200 명의 Alex를 위해 SQL 주입을 할 것이다! –

+0

입력 유효성을 검사하지 않은 사람은 출력을 생성하는 데 사용해야합니다. – u07ch

+0

+1 분사 공격은 질문과 관련이 없습니다. – Andomar

0

를 참조 executesql의 옵션을 매개 변수화 할 수 있습니다.

그러나 나머지는 사용중인 프레임 워크의 나머지 부분을 살펴보십시오. 자사의 asp.net 3.5 그리드 및 linq 내장 된 아주 작은 노력으로 당신을 위해 모든 것을 할 것입니다. http://www.asp.net/learn을보십시오.