SQL 저장 프로 시저 내 동적 정렬


126

이것은 과거에 조사하는 데 몇 시간을 소비 한 문제입니다. 그것은 현대의 RDBMS 솔루션 으로 해결해야 할 것으로 보이지만 아직 데이터베이스 백엔드가있는 웹 또는 Windows 응용 프로그램에서 매우 일반적으로 필요한 것으로 보이는 것을 발견하지 못했습니다.

동적 정렬에 대해 말합니다. 내 환상의 세계에서는 다음과 같이 간단해야합니다.

ORDER BY @sortCol1, @sortCol2

이것은 인터넷상의 포럼에서 초보자 SQL 및 저장 프로 시저 개발자가 제공 한 정식 예제 입니다. "왜 이것이 불가능합니까?" 그들이 묻다. 항상 누군가 저장 프로 시저의 컴파일 된 특성, 일반적으로 실행 계획, 그리고 매개 변수를 ORDER BY절에 직접 넣을 수없는 다른 모든 이유에 대해 강의하기 위해 누군가를 따라옵니다 .


"고객이 정렬을하도록하세요." 당연히 이것은 데이터베이스에서 작업을 오프로드합니다. 우리의 경우 데이터베이스 서버는 99 %의 땀을 흘리지 않으며 6 개월마다 발생하는 시스템 아키텍처에 대한 멀티 코어 나 다른 개선 사항도 없습니다. 이러한 이유만으로도 데이터베이스에서 정렬을 처리하는 것은 문제가되지 않습니다. 또한 데이터베이스는 매우정렬에 좋습니다. 그것들은 그것을 위해 최적화되어 있고 그것을 올바르게하기 위해 수년이 걸렸으며, 그것을하기위한 언어는 매우 유연하고, 직관적이며, 단순합니다. 무엇보다도 초보자 SQL 작성자는 어떻게해야하는지 알고, 더 중요하게는 그것을 편집하는 방법을 알고 있습니다. 데이터베이스에 세금이 부과되지 않고 개발 시간을 단순화하고 단축하려는 경우 이는 분명한 선택으로 보입니다.

그런 다음 웹 문제가 있습니다. 나는 HTML 테이블의 정렬 클라이언트 측을 자바 스크립트로 주위를 해본 적이 있지만, 그들은 필연적으로 내 요구에 대한 유연한 부족하고, 다시 내 데이터베이스가 과도하게 과세되지 않기 때문에 정말 정렬 할 수있는 정말 쉽게 I JavaScript 정렬기를 다시 작성하거나 롤업하는 데 걸리는 시간을 정당화하는 데 어려움을 겪고 있습니다. 일반적으로 서버 측 정렬에도 동일하지만 JavaScript보다 이미 훨씬 선호됩니다. 나는 특히 DataSets의 오버 헤드를 좋아하는 사람이 아니므로 고소하십시오.

그러나 이것은 불가능하지 않다는 점을 되 찾는다. 나는 이전 시스템에서 동적 정렬을 얻는 엄청나게 해킹 방법을 수행했습니다. 예쁘지 않고 직관적이거나 단순하거나 유연하지 않았으며 초급 SQL 작성기가 몇 초 안에 사라질 것입니다. 이미 이것은 "솔루션"이 아니라 "합병증"인 것으로 보입니다.


다음 예제는 모범 사례 나 우수한 코딩 스타일 등을 나타내거나 T-SQL 프로그래머로서의 내 능력을 나타내는 것이 아닙니다. 그것들은 그들이 무엇이며, 나는 그들이 혼란스럽고 나쁜 형태이며 단지 평범한 해킹임을 완전히 인정합니다.

우리는 정수 값을 저장 프로 시저에 매개 변수로 전달하고 (매개 변수를 "정렬"이라고 함) 그로부터 여러 변수를 결정합니다. 예를 들어 ... sort가 1 (또는 기본값)이라고 가정 해 보겠습니다.

DECLARE @sortCol1 AS varchar(20)
DECLARE @sortCol2 AS varchar(20)
DECLARE @dir1 AS varchar(20)
DECLARE @dir2 AS varchar(20)
DECLARE @col1 AS varchar(20)
DECLARE @col2 AS varchar(20)

SET @col1 = 'storagedatetime';
SET @col2 = 'vehicleid';

IF @sort = 1                -- Default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'asc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'asc';
END
ELSE IF @sort = 2           -- Reversed order default sort.
BEGIN
    SET @sortCol1 = @col1;
    SET @dir1 = 'desc';
    SET @sortCol2 = @col2;
    SET @dir2 = 'desc';
END

다른 열을 정의하기 위해 더 많은 @colX 변수를 선언 한 경우 "정렬"값을 기준으로 정렬 할 열로 창의적으로 만들 수있는 방법을 이미 알 수 있습니다. 사용하려면 보통 다음과 같이 보입니다. 엄청나게 지저분한 조항 :

ORDER BY
    CASE @dir1
        WHEN 'desc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir1
        WHEN 'asc' THEN
            CASE @sortCol1
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END,
    CASE @dir2
        WHEN 'desc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END DESC,
    CASE @dir2
        WHEN 'asc' THEN
            CASE @sortCol2
                WHEN @col1 THEN [storagedatetime]
                WHEN @col2 THEN [vehicleid]
            END
    END

분명히 이것은 매우 벗겨진 예입니다. 실제 항목은 일반적으로 정렬을 지원하기 위해 4 개 또는 5 개의 열이 있기 때문에 각 열에는 정렬 할 수있는 보조 열 또는 세 번째 열 (예 : 내림차순, 이름 오름차순으로 두 번째로 정렬 된 날짜) 및 각 지원 Bi- 케이스의 수를 효과적으로 두 배로하는 방향성 정렬. 응 .. 정말 빨리 털이 나옵니다.

아이디어는 저장 날짜 이전에 vehicleid가 정렬되도록 정렬 사례를 "쉽게"변경할 수 있다는 것입니다. 그러나이 간단한 예제에서 의사 유연성은 실제로 거기서 끝납니다. 본질적으로 테스트에 실패한 각 경우 (이번에는 정렬 방법이 적용되지 않기 때문에) NULL 값을 렌더링합니다. 따라서 다음과 같은 기능을하는 절로 끝납니다.

ORDER BY NULL DESC, NULL, [storagedatetime] DESC, blah blah

당신은 아이디어를 얻습니다. SQL Server는 null 값을 순서대로 효과적으로 무시하기 때문에 작동합니다. SQL에 대한 기본 작업 지식이있는 사람이라면 누구나 볼 수 있듯이 유지 관리가 매우 어렵습니다. 내가 당신을 잃어버린 경우에도 나쁘게 느끼지 마십시오. 작동하는 데 오랜 시간이 걸렸으며 여전히 편집하거나 새로운 것을 만드는 데 혼란을 겪습니다. 고맙게도 자주 변경하지 않아도됩니다. 그렇지 않으면 신속하게 "문제의 가치가 없습니다".

그러나 그것은 작품.


내 질문은 다음과 같습니다. 더 좋은 방법이 있습니까?

저장 프로 시저 솔루션 이외의 솔루션은 괜찮습니다. 가급적이면 누구나 저장 프로 시저 내에서 더 잘 할 수 있는지 알고 싶지만 그렇지 않은 경우 ASP.NET을 사용하여 사용자가 데이터 테이블을 양방향으로 동적으로 정렬 할 수 있도록 어떻게 처리합니까?

그리고 긴 질문을 읽어 주셔서 감사합니다.

추신 : 동적 정렬, 동적 필터링 / 열의 텍스트 검색, ROWNUMBER () OVER를 통한 페이지 매김 오류에 대한 트랜잭션 롤백이있는 캐치 시도 를 지원하는 저장 프로 시저의 예를 보여주지 않았다는 것을 기쁘게 생각 합니다 ... "behemoth-sized"는 심지어 그것들을 묘사하기 시작하지도 않습니다.


최신 정보:

  • 동적 SQL피하고 싶습니다 . 문자열을 함께 구문 분석하고 EXEC를 실행하면 저장 프로 시저를 처음부터 사용하려는 많은 목적을 잃게됩니다. 때로는 이러한 특수한 동적 정렬 사례에서 그러한 일을하는 데 가치가 없는지 궁금합니다. 아직도, 나는 여전히 고전적인 ASP 세계에 살고있는 것처럼 동적 SQL 문자열을 수행 할 때마다 항상 더럽습니다.
  • 우리가 처음에 저장 프로 시저를 원하는 많은 이유는 보안을 위한 것 입니다. 보안 문제에 대해서는 전화를 걸지 말고 솔루션 만 제안하십시오. SQL Server 2005를 사용하면 개별 저장 프로 시저의 스키마 수준에서 필요한 경우 사용자별로 권한을 설정 한 다음 테이블에 대한 쿼리를 직접 거부 할 수 있습니다. 이 접근법의 장단점을 결정하는 것은 아마도 또 다른 질문 일 것입니다.하지만 다시 한 번 내 결정이 아닙니다. 나는 단지 리드 코드 원숭이입니다. :)

stackoverflow.com/questions/3659981/… 도 참조하십시오 -혼합 데이터 유형을 가진 SQL Server 동적 ORDER BY
LCJ

동적 SQL은 FAR의 탁월한 방법입니다 ... IF [그리고 이것이 큰 IF] .. 데이터 액세스 계층이 엄격하고 동적 SQL은 완벽한 형태로 표현 된 RDBMS 규칙으로 엄격하게 프로그래밍 된 시스템에 의해 생성됩니다. 알고리즘 공학 데이터베이스 아키텍처는 아름다움의 하나입니다.
hajikelist

답변:


97

예, 그것은 고통스럽고, 당신이하는 방식은 내가하는 것과 비슷하게 보입니다.

order by
case when @SortExpr = 'CustomerName' and @SortDir = 'ASC' 
    then CustomerName end asc, 
case when @SortExpr = 'CustomerName' and @SortDir = 'DESC' 
    then CustomerName end desc,
...

나에게 이것은 코드에서 동적 SQL을 작성하는 것보다 훨씬 낫습니다. 이로 인해 DBA의 확장 성 및 유지 보수 악몽이됩니다.

내가 코드에서하는 일은 페이징 리팩토링과 나는 최소한의 값을 채우는 거기 반복을 많이하지 않아도 정렬 @SortExpr하고 @SortDir.

SQL에 관한 한, 다른 저장 프로 시저간에 디자인과 형식을 동일하게 유지하므로 변경시 최소한 깔끔하고 알아볼 수 있습니다.


1
바로 그거죠. 내 목표는 큰 5000 varchar 문자열에서 EXEC 명령을 수행하지 않는 것입니다. 스키마 수준에서 권한을 설정할 수 있기 때문에 보안 강화를 위해서만 저장 프로 시저를 통해 수행해야합니다. 우리의 경우 확장 성과 성능 향상은 플러스입니다.
Sean Hanley

1
{보안, 확장 성, 성능}에 유지 관리 성을 추가하십시오. DB에 대해 동적 SQL을 실행하는 3 ~ 4 개의 앱이 있으면 문제가 생길 수 있습니다. 특히 앱이 오래되고 개발자가 진행함에 따라 아무것도 변경할 수 없습니다. 실행 및 동적 SQL은 사악합니다.
Eric Z Beard

그것은 단지 --- 우리는 이미 여기에 오기 전에 이미 실행중인 모든 클래식 ASP 웹 응용 프로그램과 여전히 많은 순환 VB 응용 프로그램을 위해 이미하고 있습니다. 나는 그 중 하나에 대한 유지 보수를 수행해야 할 때마다 눈부신 실수를 해결하기 위해 충동을 멈춰야합니다.
Sean Hanley

1
SortExpr로 방향을 인코딩하는 것을 제외하고는 이것도 수행합니다. 정렬 = '이름'일 때 정렬 기준 '이름'그런 다음 이름 종료 ASC, CASE 언제 정렬 = '
Michael Bray

이것은 DBA와 소프트웨어 엔지니어 모두에게 악몽입니다. 따라서 정보 스키마를 기반으로 표현적인 SQL 문을 생성하는 동적이지만 엄격한 시스템을 사용하는 대신 하드 코딩 된 횡설수설에 대한 역겨운 혼란이 있습니다. 프로그래밍이 좋지 않습니다.
hajikelist 2016 년

23

이 방법을 사용하면 정렬 가능한 열이 순서대로 두 번 중복되는 것을 방지 할 수 있으며 좀 더 읽기 쉬운 IMO입니다.

SELECT
  s.*
FROM
  (SELECT
    CASE @SortCol1
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol1,
    CASE @SortCol2
      WHEN 'Foo' THEN t.Foo
      WHEN 'Bar' THEN t.Bar
      ELSE null
    END as SortCol2,
    t.*
  FROM
    MyTable t) as s
ORDER BY
  CASE WHEN @dir1 = 'ASC'  THEN SortCol1 END ASC,
  CASE WHEN @dir1 = 'DESC' THEN SortCol1 END DESC,
  CASE WHEN @dir2 = 'ASC'  THEN SortCol2 END ASC,
  CASE WHEN @dir2 = 'DESC' THEN SortCol2 END DESC

이것은 정답처럼 보이지만 정렬 가능한 열의 데이터 유형이 다른 경우에는 작동하지 않는 것 같습니다
SlimSim


6

내 응용 프로그램은이 작업을 많이 수행하지만 모두 동적으로 SQL을 작성합니다. 그러나 저장 프로 시저를 처리 할 때 다음과 같이하십시오.

  1. 저장 프로 시저를 정렬되지 않은 값의 테이블을 반환하는 함수로 만듭니다.
  2. 그런 다음 응용 프로그램 코드 select * from dbo.fn_myData() where ... order by ...에서 정렬 순서를 동적으로 지정할 수 있습니다.

그런 다음 최소한 동적 부분은 응용 프로그램에 있지만 데이터베이스는 여전히 많은 노력을 기울이고 있습니다.


1
그것은 아마도 동적 SQL과 저장 프로 시저를 함께 사용하는 것 사이에서 내가 본 가장 좋은 타협 일 것입니다. 나는 그것을 좋아한다. 언젠가 비슷한 접근 방식으로 실험 해 볼 수도 있지만 기존의 진행중인 프로젝트에서는 그러한 변경이 금지됩니다.
Sean Hanley

1
데이터를 리턴하는 테이블 함수 대신 로컬 테이블 변수를 사용하여 동일한 결과를 얻을 수 있습니다. 디버그 정보를 출력 할 수 있으므로 로컬 테이블이 함수보다 유연합니다.
Sanjay Zalke

5

특정 작업에 대한 동적 SQL을 피하기 위해 사용한 저장 프로 시저 기술 (해킹?)은 고유 한 정렬 열을 갖는 것입니다. 즉,

SELECT
   name_last,
   name_first,
   CASE @sortCol WHEN 'name_last' THEN [name_last] ELSE 0 END as mySort
FROM
   table
ORDER BY 
    mySort

이것은 제출하기가 쉽습니다. mySort 열의 필드를 연결하고 수학 또는 날짜 함수로 순서를 바꿀 수 있습니다.

바람직하게는 Sql-Server에서 데이터를 검색 한 후 asp.net gridviews 또는 내장 정렬 기능이있는 다른 객체를 사용하여 정렬 작업을 수행합니다. 또는 내장되어 있지 않더라도 (예 : asp.net의 데이터 테이블 등).


4

이것을 해킹 할 수있는 몇 가지 방법이 있습니다.

전제 조건 :

  1. sp에서 하나의 SELECT 문만
  2. 정렬을 생략하거나 기본값을 갖습니다.

그런 다음 임시 테이블에 삽입하십시오.

create table #temp ( your columns )

insert #temp
exec foobar

select * from #temp order by whatever

방법 # 2 : 연결된 서버를 다시 자체 서버로 설정 한 다음 openquery를 사용하여이 중에서 선택하십시오. http://www.sommarskog.se/share_data.html#OPENQUERY


4

서버에 많은 예비주기가 있으므로 세 번째 옵션이있을 수 있습니다. 임시 테이블을 통해 정렬을 수행하려면 도우미 프로 시저를 사용하십시오. 같은 것

create procedure uspCallAndSort
(
    @sql varchar(2048),        --exec dbo.uspSomeProcedure arg1,'arg2',etc.
    @sortClause varchar(512)    --comma-delimited field list
)
AS
insert into #tmp EXEC(@sql)
declare @msql varchar(3000)
set @msql = 'select * from #tmp order by ' + @sortClause
EXEC(@msql)
drop table #tmp
GO

주의 사항 : 나는 이것을 테스트하지는 않았지만 SQL Server 2005에서 작동해야합니다 (열을 미리 지정하지 않고 결과 집합에서 임시 테이블을 생성합니다).


2

언젠가는 저장 프로 시저에서 벗어나 매개 변수화 된 쿼리를 사용하여 이러한 종류의 해커를 피하는 것이 가치가 있습니까?


1
어떤 경우에는 손톱에 망치가있을 수 있지만 종종 저장 프로 시저에 직접 권한 (EXECUTE)을 설정하고 테이블, 심지어 SELECT에 대한 SQL 쿼리를 허용하지 않기를 원합니다. 나는 해커도별로 좋아하지 않지만 보안은 제 전화가 아닙니다.
Sean Hanley

1
이것이 많은 사람들이 Object Relational Mapping으로 옮기는 이유입니다. 정렬을위한 불필요한 라운드 트립, 실제로 하나만 업데이트해야 할 때 동일한 열에 대한 무의미한 업데이트를위한 방대한 CASE 블록 등. 여전히 남아있는 저장 프로 시저에 대한 가장 중요한 논거는 보안입니다.
피츠버그 DBA

ORM은 전체 텍스트 검색을 지원하지 않기 때문에 ORM (EF)에서 저장 프로 시저로 이동하고 있습니다.
Ronnie Overby 2016 년

@RonnieOverby 전체 텍스트 검색은 종종 Lucene과 같은 전용 솔루션으로 더 잘 제공됩니다.
행크 게이

@HankGay 엔티티 프레임 워크가 Lucene을 지원하지 않는다는 이상한 느낌이 있습니다.
Ronnie Overby

2

동의합니다. 클라이언트 쪽을 사용하십시오. 그러나 당신이 듣고 싶은 대답이 아닌 것 같습니다.

그래서, 그것은 완벽한 방식입니다. 왜 당신이 그것을 바꾸고 싶거나 "더 나은 방법이 있습니까?" 실제로 "길"이라고합니다. 게다가, 그것은 프로젝트의 요구에 잘 부합하는 것으로 보이며 앞으로 몇 년 동안 충분히 확장 될 수있을 것입니다. 데이터베이스에 세금이 부과되지 않고 정렬이 정말 쉬우 므로 앞으로 몇 년 동안 그렇게 유지해야합니다.

나는 땀을 흘리지 않을 것이다.


Windows 응용 프로그램을 사용하여 클라이언트쪽에 문제가 없습니다. 그러나 웹앱은 어떻습니까? JavaScript 솔루션이 실제로 충분히 유연하지 않습니다. 그리고 그렇습니다. 우리가 가진 방식대로 말했지만 SQL의 악몽입니다. 물론 더 좋은 방법이 있는지 알고 싶습니다.
Sean Hanley

최신 (2.0 이상) .NET 컨트롤에 내장되어 있습니다. 또는 직접 작성하여 데이터보기에 적용 할 수 있습니다. msdn.microsoft.com/ko-kr/library/hwf94875(VS.80).aspx
DS

2
내 문제는 확장 성과 성능 중 하나입니다. 클라이언트 측 또는 웹 서버 측 정렬을 수행하려면 한 번에 페이지에 표시 할 10 또는 15 대신 모든 데이터를로드해야합니다. 데이터베이스 정렬에는 그렇지 않지만 장기적으로는 비용이 많이 듭니다.
Sean Hanley

2

정렬 된 결과를 페이징 할 때 동적 SQL이 좋은 옵션입니다. SQL 주입에 대한 편집증이라면 열 이름 대신 열 번호를 사용할 수 있습니다. 내림차순으로 음수 값을 사용하기 전에이 작업을 수행했습니다. 이 같은...

declare @o int;
set @o = -1;

declare @sql nvarchar(2000);
set @sql = N'select * from table order by ' + 
    cast(abs(@o) as varchar) + case when @o < 0 then ' desc' else ' asc' end + ';'

exec sp_executesql @sql

그런 다음 숫자가 1에서 # 열 안에 있는지 확인하면됩니다. 당신은 열 번호 목록이 확장과 같은 기능을 사용하여 INT의 테이블에 그 구문을 분석 할 수 . 그런 다음 order by 절을 작성하십시오 ...

declare @cols varchar(100);
set @cols = '1 -2 3 6';

declare @order_by varchar(200)

select @order_by = isnull(@order_by + ', ', '') + 
        cast(abs(number) as varchar) + 
        case when number < 0 then ' desc' else '' end
from dbo.iter_intlist_to_tbl(@cols) order by listpos

print @order_by

한 가지 단점은 클라이언트 쪽에서 각 열의 순서를 기억해야한다는 것입니다. 특히 모든 열을 표시하지 않거나 다른 순서로 표시하는 경우. 클라이언트가 정렬하려고 할 때 열 이름을 열 순서에 매핑하고 정수 목록을 생성합니다.


동적보고 쿼리를 작성하기 위해 sp_executesql을 사용합니다. 매우 효과적입니다. SQL은 애플리케이션에서 빌드 할 수 없지만 매개 변수는 필요한 곳에 삽입되고 정상적으로 실행됩니다.
Josh Smeaton

2

클라이언트 측에서 정렬을 수행하는 것에 대한 논쟁은 대용량 데이터 및 페이지 매김입니다. 행 수가 쉽게 표시 할 수있는 범위를 넘어 서면 건너 뛰기 / 취득의 일부로 정렬되는 경우가 많으며 이는 아마도 SQL에서 실행하려고합니다.

Entity Framework의 경우 저장 프로 시저를 사용하여 텍스트 검색을 처리 할 수 ​​있습니다. 동일한 정렬 문제가 발생하면 내가 찾은 해결책은 검색에 저장된 프로 시저를 사용하여 일치하는 ID 키 세트 만 반환하는 것입니다. 그런 다음 목록의 ID를 사용하여 db에 대해 (정렬하여) 다시 쿼리하십시오. EF는 ID 세트가 꽤 큰 경우에도 이것을 잘 처리합니다. 예, 이것은 두 번의 왕복 여행이지만 항상 DB에서 정렬을 유지할 수 있습니다. 이는 일부 상황에서 중요 할 수 있으며 저장 프로 시저에서 논리의 보트로드를 작성하지 못하게합니다.


1

SQL이 아닌 결과, 그리드, 보고서 등을 표시하는 항목에서 정렬을 처리하는 것은 어떻습니까?

편집하다:

이 답변이 일찍 투표 된 이후로 명확하게하기 위해 조금 자세히 설명하겠습니다.

클라이언트 측 정렬에 대해 알고 있지만이를 제거하고 싶었다고 언급했습니다. 물론 그것은 당신의 전화입니다.

그러나 지적하고자하는 것은 클라이언트 측에서 데이터를 가져 와서 한 번만 데이터를 가져 와서 원하는대로 작업 할 수 있다는 것입니다. 매번 서버로 여러 번 왕복하는 것보다 정렬이 변경됩니다.

SQL Server에 지금 세금이 부과되지 않으며 훌륭합니다. 해서는 안됩니다. 그러나 아직 과부하되지 않았다고해서 영원히 그렇게 유지 될 수는 없습니다.

웹에 표시하기 위해 최신 ASP.NET 항목을 사용하는 경우 해당 항목이 이미 많이 구워졌습니다.

정렬을 처리하기 위해 각 저장 프로 시저에 너무 많은 코드를 추가 할 가치가 있습니까? 다시, 당신의 전화.

나는 궁극적으로 그것을 지원하는 사람이 아닙니다. 그러나 저장 프로 시저에서 사용하는 다양한 데이터 집합 내에서 열이 추가 / 제거되거나 (CASE 문을 수정해야 함) 갑자기 두 열로 정렬하는 대신 사용자가 3 개가 필요하다고 결정하면 이제이 방법을 사용하는 모든 저장 프로 시저를 업데이트해야합니다.

저에게는 작동하는 클라이언트 측 솔루션을 가져 와서 소수의 사용자 용 데이터 디스플레이에 적용하여 처리하는 것이 좋습니다. 새 열이 추가되면 이미 처리 된 것입니다. 사용자가 여러 열을 기준으로 정렬하려는 경우 2 개 또는 20 개를 기준으로 정렬 할 수 있습니다.


이것이 옳은 방법이지만 "더 나은 방법"으로 간주되지는 않습니다.
DS

그때 나는 여전히 C # 또는 JavaScript로 내 자신의 정렬을 작성하고 있기 때문에 SQL에서 훨씬 쉽고 빠릅니다. 따라서 내 질문. 방금 뭔가 빠진 것이 있습니까? 아니면 작업하는 모든 응용 프로그램마다 C # 또는 JavaScript로 사용자 정의 정렬을 작성하는 데 어려움이 있습니까?
Sean Hanley

3
잠깐, 수만 행의 결과 집합은 어떻습니까? 모든 데이터를 클라이언트에 반환 할 수는 없습니다. 데이터베이스에서 페이징 및 정렬을 수행해야합니다.
Eric Z Beard

야딘, 이해 했어 그러나 그리드에 대한 일반 분류 기가 있으면 모든 것을 위해 사용합니다.
케빈 페어차일드

Eric, True ... 그런 경우 추가 처리가 필요하며 SQL 내에서 의미가있을 수 있습니다. 옳고 그른 문제와는 거리가 멀다. 어떤 경우에는 클라이언트에서 SQL에 적합하고 어떤 경우에는 의미가 있습니다.
케빈 페어차일드

1

파티에 늦어서 미안하지만 동적 SQL을 피하고 싶지만 유연성을 원하는 사람들을위한 또 다른 옵션이 있습니다.

동적으로 SQL을 동적으로 생성하는 대신 가능한 모든 변형에 대해 고유 한 proc을 생성하는 코드를 작성하십시오. 그런 다음 코드에서 메소드를 작성하여 검색 옵션을보고 호출 할 적절한 proc을 선택하도록 할 수 있습니다.

몇 가지 변형 만 있다면 직접 손으로 procs를 만들 수 있습니다. 그러나 많은 변형이있는 경우 모든 것을 유지 관리하는 대신 proc 생성기를 유지 관리하는 대신 다시 생성하도록하십시오.

추가 혜택으로이 방법으로도 더 나은 성능을 발휘할 수있는 더 나은 SQL 계획을 얻게됩니다.


-1

이 솔루션은 .NET에서만 작동 할 수 있습니다.

SQL order by 절의 초기 정렬 순서로 데이터를 C #으로 가져 와서 해당 데이터를 DataView에 넣고 세션 변수에 캐시 한 다음 페이지를 작성하는 데 사용합니다.

사용자가 열 머리글을 클릭하여 정렬 (또는 페이지 또는 필터)하면 데이터베이스로 돌아 가지 않습니다. 대신 캐시 된 DataView로 돌아가서 "Sort"속성을 동적 SQL처럼 동적으로 생성하는 식으로 설정합니다. ( "RowFilter"속성을 사용하여 같은 방식으로 필터링을 수행합니다).

http://ifdefined.com/btnet/bugs.aspx 에서 내 앱 BugTracker.NET의 데모에서 작동하는 것을 보거나 느낄 수 있습니다.


단! 버그 트래커 .NET 락!
digiguru

-7

필요한 경우가 아니면 SQL Server 정렬을 피해야합니다. 앱 서버 또는 클라이언트 측에서 정렬하지 않는 이유는 무엇입니까? 또한 .NET Generics는 탁월한 정렬을 수행합니다.


6
확장 성 때문입니다. 수천 행은 괜찮지 만 10 만 줄을 내리고 싶지는 않습니다. 이상. 또한 페이징은 어떻습니까? 나는 종종 내가 디스플레이해야 할 것을 끌어 내고 싶다. 사실 이후에 24056의 21-30 행을 정렬하는 것은 올바르지 않습니다.
Sean Hanley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.