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