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

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

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ũ

Bài này sẽ tiếp tục các hàm và thủ tục cho bảng TB_News

1. Trigger để cập nhật tự động trường Link cho bài viết

Để tự động cập nhật trường liên kết cho bài viết bạn có thể thực hiện như Trigger sau

-- Create by webmaster@hmweb.com.vn

CREATE TRIGGER [dbo].[TB_News_InsertTrigger]

ON [dbo].TB_News 

FOR INSERT AS 

DECLARE   @Link nvarchar(100)

DECLARE @NewID int

DECLARE  @CateID int

SELECT  @CateID = (SELECT  CateID FROM  Inserted)

SELECT  @Link=Link FROM TB_Category  WHERE CateID =@CateID

SELECT @NewID=(Select idNews from Inserted)

SET @Link=@Link+'&NewsID='+Cast(@NewID AS nvarchar(20))

--Cập nhật trường liên kết cho bài viết

UPDATE  TB_News SET  Link=@Link

      WHERE idNews=(Select idNews from Inserted)

2.  Store procedure Truy vấn danh sách bài viết

Bài viết có thể ở 1 trong 2 trạng thái đã đăng hoặc chưa đăng (Ở đây mình phân tích chỉ 2 trạng thái, nếu ứng dụng của bạn có yêu cầu phân quyền nhiều cấp như trạng thái chờ đăng, trạng thái chờ duyệt, trạng thái đăng ... thì bạn sửa lại cho phù hợp). Trong store procedure sau tùy theo @Action đề lấy bài viết theo trạng thái tương ứng:
- Nếu @Action=0 thì truy vấn tất cả - cả đã đăng và chờ đăng
- Nếu @Action=1 thì truy vấn các bài đã đăng
- Nếu @Action=-1 thì truy vẫn các bài chờ đăng.
Khi sử dụng store này tùy vào yêu cầu mà bạn Set giá trị của @Action

-- =============================================

-- Author:        webmaster@hmweb.com.vn

-- Description:   <Truy vấn bài viết>

-- =============================================

CREATE PROCEDURE [dbo].[spRB_News_Select]

@Action int,

@idNews int

AS

BEGIN

      -- Nếu @Action=1 => truy vấn bài viết có trạng thái đã đăng

      IF @Action=1

      BEGIN

            -- Nếu @idNews=0 => truy vấn hết các bài đã đăng

            IF @Action=0

            BEGIN

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID

                  WHERE TB_News.Status=1

            END

            ELSE

            --Nếu @idNew>0 => Truy vấn bài viết đã đăng theo idNews

            BEGIN

                  -- Cập nhật số lần xem bài viết

                  DECLARE @Numberreads int

                  SET @Numberreads=0

                  SELECT @Numberreads=Numberreads FROM TB_News WHERE idNews=@idNews

                  UPDATE TB_News

                  SET

                        Numberreads =@Numberreads +1

                  WHERE idNews=@idNews

                  -- Nếu cập nhật thành công => Select

                  IF @@ERROR=0     

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID

                  WHERE TB_News.Status=1 AND TB_News.idNews=@idNews

            END

      END



      -- Nếu @Action=-1 => truy vấn bài viết có trạng thái chưa đăng

      IF @Action=-1

      BEGIN

            -- Nếu @idNews=0 => truy vấn hết các bài chưa đăng

            IF @Action=0

            BEGIN

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID

                  WHERE TB_News.Status=0

            END

            ELSE

            --Nếu @idNew>0 => Truy vấn bài viết chưa đăng theo idNews

            BEGIN

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID

                  WHERE TB_News.Status=0 AND TB_News.idNews=@idNews

            END

      END



      -- Nếu @Action=0 => truy vấn All (Cả trạng thái đã đăng và chưa đăng)

      IF @Action=0

      BEGIN

            -- Nếu @idNews=0 => truy vấn hết các bài chưa đăng

            IF @Action=0

            BEGIN

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID



            END

            ELSE

            --Nếu @idNew>0 => Truy vấn bài viết chưa đăng theo idNews

            BEGIN

                  SELECT    

                  TB_Category.CateID,

                  TB_Category.ParentID,

                  TB_Category.CateName,

                  TB_News.idNews,

                  TB_News.UserName,

                  TB_News.Title,

                  TB_News.Description,

                  TB_News.Content,

                  TB_News.Author,

                  TB_News.Picture,

                  -- Chuyển thời gian thành dd/MM/yyyy

                  CONVERT(nvarchar(30),TB_News.CreateDate,103) AS CreateDate,

                  CONVERT(nvarchar(30),TB_News.PublishDate,103) AS PublishDate,

                  CASE TB_News.Status

                        WHEN 1 THEN N'Đã đăng'

                        WHEN 0 THEN N'Chưa đăng' END AS Status, 

                  TB_News.Numberreads,

                  TB_News.Link,

                  TB_Category.Decen,

                  TB_Category.Depth

                  FROM  TB_Category INNER JOIN

                  TB_News ON TB_Category.CateID = TB_News.CateID

                  WHERE  TB_News.idNews=@idNews

            END

      END

END