관리 메뉴

웹개발자의 기지개

[MS-SQL] 저장프로시저 페이징 예제 1 본문

SQL/MS-SQL

[MS-SQL] 저장프로시저 페이징 예제 1

웹개발자 워니 2025. 11. 1. 16:13

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
 
ALTER PROCEDURE [dbo].[sp_pay_suryo_list]
    @table     varchar(30),
    @Limit    INT,           -- 페이지당 레코드 수
    @Page     INT,           -- 페이지 번호 (1부터)
    @Lec_code VARCHAR(50= NULL     -- 강의 코드
 
AS
 
BEGIN
    SET NOCOUNT ON;
 
    -------------------------------------------------
    -- 1. 기본 방어
    -------------------------------------------------
    IF (@Limit IS NULL OR @Limit <= 0)
    BEGIN
        RAISERROR ('@Limit must be > 0'161);
        RETURN;
    END
 
    IF (@Page IS NULL OR @Page <= 0)
    BEGIN
        SET @Page = 1;
    END
 
    -------------------------------------------------
    -- 2. 페이징 계산값
    -------------------------------------------------
    DECLARE @n_limit INT;
    DECLARE @n_range INT;
 
    SET @n_limit = @Limit;
    SET @n_range = (@Limit * @Page);
 
    -------------------------------------------------
    -- 3. 조건절 구성 (강의코드가 있을 경우 WHERE 절에 포함)
    -------------------------------------------------
    DECLARE @WhereCond VARCHAR(300= '';
 
    IF (@Lec_Code IS NOT NULL AND LTRIM(RTRIM(@Lec_Code)) <> '')
        SET @WhereCond = ' WHERE LEC_CODE = ''' + @Lec_Code + '''';
 
    -------------------------------------------------
    -- 4. 전체 건수 조회 (조건 반영)
    -------------------------------------------------
    DECLARE @TotalCountSql NVARCHAR(400);
    DECLARE @TotalCount INT;
 
    SET @TotalCountSql = 'SELECT @TC = COUNT(*) FROM ' + @Table + ' (NOLOCK) ' + @WhereCond;
 
    EXEC sp_executesql
        @TotalCountSql,
        N'@TC INT OUTPUT',
        @TC = @TotalCount OUTPUT;
 
    -------------------------------------------------
    -- 5. 실제 데이터 조회 SQL 구성
    -------------------------------------------------
    DECLARE @Sql NVARCHAR(MAX);
 
    SET @Sql = 'SELECT ' +
        'SEQ, UID, NAME, UNIV_ID, UNIV_NAME, ' +
        'LEC_CODE, LEC_NAME, LEC_TID, ' +
        'PRICE, PAY_METHOD, PAY_TYPE, PAY_UNIT, ' +
        'ORDER_DATE, PAY_DATE, MEMO, ' +
        'lec_start, lec_end, txn_id, OID, RECEIPT, STATE, ' +
        'suryo_num, poll, ' +
        CAST(@TotalCount AS VARCHAR(20)) + ' AS TOTAL_COUNT ' +
    'FROM ' + @Table + ' (NOLOCK) ' +
    'WHERE SEQ IN (' +
    '   SELECT TOP ' + CAST(@n_limit AS VARCHAR(20)) + ' SEQ FROM (' +
    '       SELECT TOP ' + CAST(@n_range AS VARCHAR(20)) + ' SEQ FROM ' + @Table + ' (NOLOCK) ' +
            @WhereCond +  -- 조건절 포함
    '       ORDER BY SEQ DESC' +
    '   ) AS a ' +
    '   ORDER BY SEQ ASC' +
    ') ' +
    'ORDER BY SEQ DESC;';
 
    -------------------------------------------------
    -- 6. 실행
    -------------------------------------------------
    EXEC(@Sql);
END
 
---------------------------
--EXEC sp_pay_suryo_list
--    @Table = '_ORDER_B2C',
--    @Limit = 30,
--    @Page = 1,
--    @Lec_Code = '258';
----------------------------
 
cs

 

 

 

 

Comments