Xây dựng cơ sở dữ liệu cho một website phần 4

Loại: Viết store procedure phần 2

Các bài cần theo dõi của bài viết: Xây dựng cơ sở dữ liệu cho một website

Phần 1: Tạo database

Phần 2: Viết Trigger

Phần 3: Viết store procedure truy vấn, thêm, sửa, xóa một chuyên mục

Phần 4: Viết store procedure hiển thị menu đa cấp

Phần 5: Viết store Procedure thêm, sửa, xóa một bài viết

Phần 6: Viết store procedure hiển thị danh sách bài viết

Phần 7: Viết store procedure tìm kiếm bài viết

Phần 8: Viết store procedure top 10 các bài viết mới và cũ

Tiếp theo các thủ tục và hàm cho bảng TB_Category. Khi lập trình tốt trong SQL thì bạn sẽ đỡ rất nhiều việc khi viết code (asp.net)

1. Hàm lấy tên miền của ứng dụng

Bạn cần viết một hàm lấy thông tin domain của bạn để tiện cho việc viết các Store proceduce

-- ================================
-- Author:  webmaster@hmweb.com.vn
-- ================================
CREATE   FUNCTION dbo.ufDomainName()
RETURNS VarChar(100)
AS 
BEGIN 
      RETURN 'http://www.hmweb.com.vn'
END

2. Thủ tục hiển thị menu đa cấp
Thủ tục sau sẽ thực hiện việc hiển thị menu đa cấp, tất cả sẽ được thực hiện bằng Store, Trong code khi muốn hiển thị menu đa cấp bạn chỉ cần dùng Gridview để hiển thị.
Trong thủ tục này mình chỉ viết đến cấp 3. Nếu website của bạn có nhiều hơn 3 cấp bạn có thể sửa lại cho phù hợp (website của mình hmweb.com.vn cũng đến cấp 3)

-- ================================
-- Author:  webmaster@hmweb.com.vn
-- ================================
CREATE PROCEDURE [dbo].[spTB_Category_LeftMenu]
@TabID int,
@CateID int
AS
-- Nếu @TabID=0 thì Menu chỉ gồm cấp 1
IF @TabID=0
BEGIN
       SELECT
            TB_Category.CateID, 
            TB_Category.ParentID, 
            '<A href='''+ dbo.ufDomainName()+Link +''' >'+ CateName +'</A>' AS CateName,  
            TB_Category.Decen, 
            TB_Category.Depth,
            TB_Category.Link, 
            TB_Category.CssClass
            FROM   TB_Category 
            WHERE TB_Category.Decen=0  ORDER BY TB_Category.Depth
END
ELSE
-- Nếu @TabID>0 thì hiển thị các cấp phụ thuộc vào @CateID
BEGIN
      -- Nếu @CateID=0 thì hiển thị đến Menu cấp 2
      IF @CateID=0
            BEGIN
                  SELECT
                  TB_Category.CateID, TB_Category.ParentID, 
                  '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                  TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass                   FROM         TB_Category
                  WHERE TB_Category.Decen=0 AND ParentID=@TabID
                  UNION
                  SELECT
                  TB_Category.CateID, TB_Category.ParentID, 
                  '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                  TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass FROM  TB_Category 
                  WHERE TB_Category.Decen=1 AND TB_Category.ParentID=@TabID
                  UNION
                  SELECT TB_Category.CateID, TB_Category.ParentID, 
                        '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                        TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass 
                  FROM  TB_Category  
                  WHERE TB_Category.Decen=0 AND TB_Category.CateID<>@TabID 
                  ORDER BY TB_Category.Depth
            END
      ELSE
            -- Ngược lại @CateID>0 hiển thị đến Menu cấp 3
            BEGIN
                  SELECT TB_Category.CateID, TB_Category.ParentID, 
                  '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                  TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass 
                  FROM TB_Category  
                  WHERE TB_Category.Decen=0 AND TB_Category.CateID=@TabID
                  UNION
                  SELECT TB_Category.CateID, TB_Category.ParentID, 
                  '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                  TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass 
                  FROM  TB_Category 
                  WHERE TB_Category.Decen=1 AND TB_Category.ParentID=@TabID
                  UNION 
                        SELECT TB_Category.CateID, TB_Category.ParentID, 
                        '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName, 
                        TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass
                        FROM  TB_Category 
                        WHERE TB_Category.Decen=2 AND TB_Category.ParentID=@CateID
                  UNION
                   SELECT TB_Category.CateID, TB_Category.ParentID, 
                   '<A href='''+ dbo.ufDomainName()+Link +''' class='''+CssClass+'''>'+CateName +'</A>' AS CateName,
                   TB_Category.Decen, TB_Category.Depth, TB_Category.Link, TB_Category.CssClass FROM TB_Category 
                  WHERE  TB_Category.Decen=0 AND TB_Category.CateID<>@TabID 
                  ORDER BY TB_Category.Depth
            END
END


Bạn hãy chạy thử với câu lệnh sau

EXEC spTB_Category_LeftMenu 5,9

--> khi đó kết quả sẽ được hiển thị như bảng sau

Trong kết quả trên bạn thấy trong trường CateName có đầy đủ cả liên kết và class đã được định nghĩa trong Bảng TB_Category như những bài trước đã viết (Trường ClassName theo cấp menu được sinh tự động bằng spTB_Categoey_Edit). Trong code bạn chỉ cần viết các ClassName trong css để hiển thị cho phù hợp. Trường Link của bạn nếu có sẽ hiển thị trong trường CateName ví dụ với CateID=5 có Link=?Tab=5 khi đó trường CateName trong store trên sẽ như sau:

<A href='http://www.hmweb.com.vn?Tab=5' class='MenuLevel_1'>Thể thao</A>

3. Thủ tục GetSubTree

Tiếp theo là thủ tục để hiển thị tất cả các phần tử là con của một cấp menu. Bạn viết Procedure như sau:

-- =============================================
-- Author:        webmaster@hmweb.com.vn
-- Description:   <GetSubTree>
-- =============================================
CREATE PROCEDURE [dbo].[spTB_Category_GetSubTree]
@CateID int
AS
BEGIN
      SELECT CateID, 
      ParentID,
      CASE  Decen 
            WHEN 0 THEN CateName
            WHEN 1 THEN '* '+ CateName
            WHEN 2 THEN '* * '+ CateName
            WHEN 3 THEN '* * :: ' + CateName
            WHEN 4 THEN '* * :: -- ' +CateName
            WHEN 5 THEN '* * :: -- --' +CateName
      END AS CateName, 
      Decen, 
      Depth, 
      Link, 
      Target,
      CssClass, 
      Active
      FROM TB_Category WHERE ParentID=@CateID
      ORDER BY Depth 
END

 Vậy là đã có các thủ tục cơ bản của bảng Category. Website của bạn có thể có những yêu cầu khác, bạn có thể viết thêm các thủ tục theo yêu cầu. Tiếp theo chúng ta sẽ viết các hàm và procedure cho bảng TB_News

 

Xây dựng cơ sở dữ liệu cho một website phần 3

Loại: Viết store procedure phần 1

Các bài cần theo dõi của bài viết: Xây dựng cơ sở dữ liệu cho một website

Phần 1: Tạo database

Phần 2: Viết Trigger

Phần 3: Viết store procedure truy vấn, thêm, sửa, xóa một chuyên mục

Phần 4: Viết store procedure hiển thị menu đa cấp

Phần 5: Viết store Procedure thêm, sửa, xóa một bài viết

Phần 6: Viết store procedure hiển thị danh sách bài viết

Phần 7: Viết store procedure tìm kiếm bài viết

Phần 8: Viết store procedure top 10 các bài viết mới và cũ

Tiếp theo chúng ta sẽ viết các store procedure cho bảng TB_Category
1. Store procedure thêm, sửa, xóa một chuyên mục
Thường bạn viết các PROC để xử lý các hành động thêm, sửa, xóa một bản ghi bạn tách ra làm 3 PROC, Ở đây mính sẽ viết PROC spTB_Category_Edit để thực hiện cả 3 hành động trên

-- Bạn hãy tạo cho mình thói quen viết PROC theo quy tắc, ở đây mình luôn viết sp sau đó đến tên bảng ...
-- Create by webmaster@hmweb.com.vn
CREATE PROC [dbo].[spTB_Category_Edit]
@Action int,
@CateID int,
@ParentID int,
@CateName nvarchar(250),
@Link nvarchar(250),
@Target nvarchar(20),
@Active int

AS

BEGIN

      -- Nếu @Action=0 --> Xóa chuyên mục theo @CateID

      IF @Action=0

            BEGIN

                  DELETE FROM TB_Category WHERE CateID=@CateID

            END

      -- Nếu Nếu @Action=1 --> Thêm mới hoặc sửa Chuyên mục

      ELSE

            IF @Action=1

                  IF @ParentID = 0  SET @ParentID = NULL

                  BEGIN

                        --Nếu @CateID=0 --> Thêm mới chuyên mục

                        INSERT INTO

                              TB_Category

                              (

                                    ParentID,

                                    CateName,

                                    Link,

                                    Target,

                                    Active

                              )

                              VALUES

                              (

                                    @ParentID,

                                    @CateName,

                                    @Link,

                                    @Target,

                                    @Active

                              )

                        -- Cập nhật định dạng cho chuyên mục vừa thêm

                        -- Nếu lệnh thêm ở trên không xảy ra lỗi

                        IF @@ERROR=0

                              BEGIN

                                    DECLARE @CssClass nvarchar(50)

                                    DECLARE @Decen int

                                    SELECT @Decen =Decen FROM TB_Category WHERE CateID=(SELECT MAX(CateID) FROM TB_Category)

                                    IF @Decen IS NULL SET @Decen=0

                                    if @Decen =0  SET @CssClass='MenuLevel_1'

                                    if @Decen =1  SET @CssClass='MenuLevel_2'

                                    if @Decen =2  SET @CssClass='MenuLevel_3'

                                    if @Decen =3  SET @CssClass='MenuLevel_4'

                                    if @Decen =4  SET @CssClass='MenuLevel_5'

                                    UPDATE TB_Category

                                    SET CssClass =  @CssClass  WHERE CateID=(SELECT MAX(CateID) FROM TB_Category)

                              END

                  END

                  -- Nếu @CateID>0 --> Cập nhật Category Theo CateID

                  IF @CateID>0

                  BEGIN

                        UPDATE TB_Category

                        SET



                              ParentID = @ParentID,

                              CateName = @CateName,

                              Link = @Link,

                              Target = @Target,

                              Active = @Active

                        WHERE CateID=@CateID

                        IF @@ERROR=0

                        BEGIN

                              DECLARE @CssClass1 nvarchar(50)

                              DECLARE @Decen1 int

                              SELECT @Decen1 =Decen FROM TB_Category WHERE CateID=@CateID

                              IF @Decen1 IS NULL SET @Decen1=0



                              if @Decen1 =0  SET @CssClass1='MenuLevel_1'

                              if @Decen1 =1  SET @CssClass1='MenuLevel_2'

                              if @Decen1 =2  SET @CssClass1='MenuLevel_3'

                              if @Decen1 =3  SET @CssClass1='MenuLevel_4'

                              if @Decen1 =4  SET @CssClass1='MenuLevel_5'

                              UPDATE TB_Category

                              SET CssClass =  @CssClass1  WHERE CateID=@CateID

                        END

                  END

END

Trong Proc này ta sẽ thấy hành động
Nếu @Action=0 thì thực hiện việc xóa theo CateID
Nếu @Action=1 (Hoặc bạn có thể để Else vậy là đủ nếu trong điều kiện Else không có nhiều điều kiện khác) thì phụ thuộc vào @CateID. Nếu @CateID=0 thì Thêm mới, Nếu @CateID>0 thì cập nhật theo CateID
Các trường Decen và Depth đã được tự động xử lý trong Trigger trong bài trước
Trường CssClass cũng sẽ được cập nhật tự động trong PROC này, và trong Project của bạn cũng cần viết các MenuLevel tương ứng để hiển thị trên website

2. Store procedure Select TB_Category theo dạng cây chuyên mục

-- Create by webmaster@hmweb.com.vn 

CREATE PROCEDURE [dbo].[spTB_Category_GetTree]

@CateID int

AS

BEGIN

      IF @CateID =0

            BEGIN

                    SELECT

                    CateID,

                    ParentID,

                        CASE  Decen

                        WHEN 0 THEN CateName

                        WHEN 1 THEN ':: '+ CateName

                        WHEN 2 THEN ':: -- '+ CateName

                        WHEN 3 THEN ':: -- .. ' + CateName

                        WHEN 4 THEN ':: -- .. .. ' +CateName

                        WHEN 5 THEN ':: -- .. .. .. ' +CateName

                        END AS CateName,

                        Decen,

                        Depth,

                        Link,

                        Target,

                        CssClass, Active

                          FROM TB_Category

                        ORDER BY Depth ASC

            END

       ELSE

            BEGIN

                        SELECT CateID, ParentID,

                        CASE  Decen

                        WHEN 0 THEN CateName

                        WHEN 1 THEN ':: '+ CateName

                        WHEN 2 THEN ':: -- '+ CateName

                        WHEN 3 THEN ':: -- .. ' + CateName

                        WHEN 4 THEN ':: -- .. .. ' +CateName

                        WHEN 5 THEN ':: -- .. .. .. ' +CateName

                        END AS CateName,

                        Decen,

                        Depth,

                        Link,

                        Target,

                        CssClass,

                        Active

                          FROM TB_Category

                        WHERE Depth LIKE (SELECT Depth FROM TB_Category WHERE TB_Category.CateID=@CateID) + '%'

                        ORDER BY Depth asc 

            END

END

Trong store trên Mình hiển thị đến Menu cấp 5. Nếu ứng dụng của bạn có nhiều cấp hơn 5 thì bạn có thể sửa theo yêu cầu
Đề xem toàn bộ tree chuyên mục của bạn bạn dùng lệnh sau EXEC spTB_Category @CateID=0 -->Kết quả như sau (Demo)

Để hiển thị cây của chuyên mục thể thao bạn dùng lệnh EXEC spTB_Category_GetTree 5  --> Kết quả như sau:

 

3. Store procedure  xóa SubTree

Thủ tục sau sẽ xóa toàn bộ một chuyên mục và tất cả cấp "con"  của nó (Xóa SubTree). Bạn viết thủ tục như sau:

-- ================================
-- Author:  webmaster@hmweb.com.vn
-- ================================
CREATE PROCEDURE [dbo].[spTB_ChuyenMuc_DeleteNode]
@CateID int
AS
BEGIN
      DELETE FROM TB_Category
      WHERE Depth LIKE (
      SELECT Depth FROM TB_Category WHERE CateID = @CateID
      ) + '%'
END
--Lưu ý là khi bạn xóa chuyên muc hoặc Subtree bạn cần chắc chắn muốn xóa và cần xóa hế quan hệ dữ liệu

 

Xây dựng cơ sở dữ liệu cho một website phần 2

Loại: Viết Trigger

Các bài cần theo dõi của bài viết: Xây dựng cơ sở dữ liệu cho một website

Phần 1: Tạo database

Phần 2: Viết Trigger

Phần 3: Viết store procedure truy vấn, thêm, sửa, xóa một chuyên mục

Phần 4: Viết store procedure hiển thị menu đa cấp

Phần 5: Viết store Procedure thêm, sửa, xóa một bài viết

Phần 6: Viết store procedure hiển thị danh sách bài viết

Phần 7: Viết store procedure tìm kiếm bài viết

Phần 8: Viết store procedure top 10 các bài viết mới và cũ

Viết các TRIGGER: Tiếp theo mình sẽ giới thiệu các TRIGGER để sinh và cập nhật tự động cho bảng TB_Category (Độ sâu vầ phân cấp của chuyên mục) và bảng TB_News

1. Trigger For TB_Category

Với bảng TB_Category để thể hiện các chuyên mục của website và cũng để thể hiện menu đa cấp nên chúng ta cần viết các Trigger để tự động cập nhật độ sâu và phân cấp cho menu. Như vậy mính sẽ phải viết 2 Trigger For Update và For Insert

a. Trigger For Insert

-- Create by webmaster@hmweb.com.vn

CREATE TRIGGER [dbo].[TB_Category_InsertTrigger]

ON [dbo].[TB_Category]

FOR INSERT AS
-- Tính và cập nhật lại Độ sâu và phân cấp của chuyên mục (For Inserted)

UPDATE child

      SET Decen = ISNULL(parent.Decen + 1,0),

      Depth = ISNULL(parent.Depth,'/') + LTrim(Str(child.CateID)) + '/'

 FROM TB_Category child INNER JOIN inserted i ON i.CateID=child.CateID

 LEFT OUTER JOIN TB_Category parent ON child.ParentID=parent.CateID

 b. Trigger For Update

-- Create by webmaster@hmweb.com.vn

CREATE TRIGGER [dbo].[TB_Category_UpdateTrigger]

ON [dbo].[TB_Category]

FOR UPDATE AS



IF UPDATE (ParentID)

-- Thực hiện cập nhật độ sâu và Phân cấp của thư mục

UPDATE child



      SET Decen = child.Decen - old.Decen + ISNULL(parent.Decen + 1,0),

      Depth = ISNULL(parent.Depth,'/') + LTrim(Str(old.CateID)) + '/' +

                    right(child.Depth, len(child.Depth) - len(old.Depth))



FROM TB_Category child

INNER JOIN inserted old ON child.Depth LIKE old.Depth + '%'

LEFT OUTER JOIN TB_Category parent ON old.ParentID=parent.CateID

 

Xây dựng cơ sở dữ liệu cho một website phần 1

Loại: Tạo database

Các bài cần theo dõi của bài viết: Xây dựng cơ sở dữ liệu cho một website

Phần 1: Tạo database

Phần 2: Viết Trigger

Phần 3: Viết store procedure truy vấn, thêm, sửa, xóa một chuyên mục

Phần 4: Viết store procedure hiển thị menu đa cấp

Phần 5: Viết store Procedure thêm, sửa, xóa một bài viết

Phần 6: Viết store procedure hiển thị danh sách bài viết

Phần 7: Viết store procedure tìm kiếm bài viết

Phần 8: Viết store procedure top 10 các bài viết mới và cũ

Khi bắt đầu xây dựng một website. Công việc đầu tiên cần phải làm là phân tích, thiết kế cơ sở dữ liệu. Mình sẽ viết hướng dẫn xây dựng cơ sở dữ liệu và code từng bước để có thể xây dựng 1 website hoàn chỉnh

Chúng ta hãy bắt đầu với 2 bảng cơ bản của 1 website. TB_Categoty, TB_News

Bạn hãy thiết kế theo Diagram như sau:

-- Ngoài các trường như trong Diagram có thể có thêm các trường khác tùy theo yêu cầu của website

 1. Category

CateID: Mã chuyên mục - sẽ được sinh tự động khi tạo mới
ParentID: int Mã chuyên mục cha.
CateName: Tên chuyên mục. VD: Tin tức, Tin thể thao …
Decen: phân cấp của chuyên mục (thể hiện menu)
Depth: độ sâu của chuyên mục (Bắt đầu từ 0)
Link: Liên kết thực
Picture: Hình ảnh đại diện cho chuyên mục
CssClass: Định dạng hiển thị
Active: Trạng thái.

  • Trường Decen và Depth cần được sinh tự động bằng các viết các TRIGGER. Mình sẽ giới thiệu ở bài sau
  • Trường CssClass cũng sẽ được sinh tự động khi thêm mới hoặc cập nhật nhưng sẽ được thực hiện trong Procedure spTB_Category_Edit sẽ được giới thiệu ở bài sau

Vì bảng TB_Category cũng là bảng thể hiện menu đa cấp được mô tả như sau (Minh họa):

 

-- Create by  webmaster@hmweb.com.vn
 CREATE TABLE [dbo].[TB_Category](
      [CateID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
      [ParentID] [int] NULL,
      [CateName] [nvarchar](250) NOT NULL,
      [Decen] [int] NULL,
      [Depth] [varchar](150) NULL,
      [Link] [nvarchar](250) NULL,
      [Picture] [varbinary](250) NULL,
      [Target] [nvarchar](10) NULL
            CONSTRAINT [DF_TB_Category_Targer] 
            DEFAULT (N'_self'),
      [CssClass] [nvarchar](50) NULL,
      [Active] [int] NOT NULL
            CONSTRAINT [DF_TB_Category_Flag] 
            DEFAULT (1),
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[TB_Category] 

      WITH NOCHECK ADD 

      CONSTRAINT [FK_TB_Category_TB_Category] FOREIGN KEY([ParentID])

REFERENCES [dbo].[TB_Category] ([CateID])

GO

ALTER TABLE [dbo].[TB_Category]

      CHECK CONSTRAINT [FK_TB_Category_TB_Category]

GO

ALTER TABLE [dbo].[TB_Category] 

      WITH NOCHECK ADD 

      CONSTRAINT [CK_TB_Category] CHECK  (([CateID] <> [ParentID]))

GO

ALTER TABLE [dbo].[TB_Category] CHECK CONSTRAINT [CK_TB_Category]

2. TB_News

idNews: Mã bài viết - Sẽ được sinh tự động khi tạo mới
CateID: Mã chuyên mục
UserName: Tên đăng nhập (Người viết bài)
Title: Tiêu đề bài viết
Description: Tóm tắt nội dung bài viết
Content: Nội dung bài viết
Author: Tác giả vài viết
Picture:  Ảnh đại diện cho bài viết
CreateDate: Thời gian viết bài
PublishDate: Thời gian đăng bài
Status: Trạng thái bài viết
Numberreads: Số lần xem bài viết
Link: Url của bài viết 

-- Create by webmaster@hmweb.com.vn

 CREATE TABLE [dbo].[TB_News](

      [idNews] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,

      [CateID] [int] NOT NULL,

      [UserName] [nvarchar](50) NOT NULL,

      [Title] [nvarchar](500) NOT NULL,

      [Description] [ntext] NULL,

      [Content] [ntext] NULL,

      [Author] [nvarchar](150) NULL,

      [Picture] [nvarchar](255) NULL,

      [CreateDate] [datetime] NOT NULL,

      [PublishDate] [datetime] NULL,

      [Status] [int] NULL,

      [Numberreads] [int] NULL,

      [Link] [nvarchar](150) NULL

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



GO

ALTER TABLE [dbo].[TB_News]  WITH NOCHECK ADD  CONSTRAINT [FK_TB_News_TB_Category] FOREIGN KEY([CateID])

REFERENCES [dbo].[TB_Category] ([CateID])

GO

ALTER TABLE [dbo].[TB_News] CHECK CONSTRAINT [FK_TB_News_TB_Category]

 

Phân trang trong SQL

Xin giới thiệu với các bạn Procedure phân trang dữ liệu trong SQL server
Giả sử ta có 1 bảng trong cơ sở dữ liệu chỉ gốm 2 trường là CateID và CateName. sau đây là Store phân trang khi cần truy vấn dữ liệu có phân trang

CREATE PROCEDURE [dbo].[spPhanTrang_Table] (
    @PageNumber int,
    @PageSize int
)

AS
    DECLARE @Start int, @End int
    BEGIN TRANSACTION GetDataSet
    SET @Start = (((@PageNumber - 1) * @PageSize) + 1)
    IF @@ERROR <> 0
        GOTO ErrorHandler
    SET @End = (@Start + @PageSize - 1)
    IF @@ERROR <> 0
        GOTO ErrorHandler
    CREATE TABLE #TemporaryTable (
        Row int IDENTITY(1,1) PRIMARY KEY,
        CateID int, CateName nvarchar(100)
    )
    IF @@ERROR <> 0
            GOTO ErrorHandler
    INSERT INTO #TemporaryTable
        SELECT CateID, CateName FROM [TB_Category] 
    IF @@ERROR <> 0
        GOTO ErrorHandler
    SELECT CateID, CateName  
        FROM #TemporaryTable
        WHERE (Row >= @Start) AND (Row <= @End)
    IF @@ERROR <> 0
        GOTO ErrorHandler
    DROP TABLE #TemporaryTable
    COMMIT TRANSACTION GetDataSet
    RETURN 0
ErrorHandler:
ROLLBACK TRANSACTION GetDataSet
RETURN @@ERROR
Để sử dụng Store trên Bạn dùng lệnh:
EXEC spPhanTrang_Table (1,20) -- Nếu bạn muốn hiển thị dữ liệu trang 1 và 20 bản ghi trên 1 trang
Chúc các bạn thành công