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

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

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 mình sẽ viết thủ tục tìm kiếm bài viết theo điều kiện
Trong thủ tục này mình viết tìm kiếm bài viết đơn giản theo trạng thái (Status), Theo Chuyên mục (CateID) và theo từ khóa (Keyword). Ngoài ra bạn muốn tìm theo các trường khác như Thời gian viết, Thời gian đăng, ... bạn có thể bổ xung vào thủ tục
+ Trang Thái
   - Nếu @Status=1 => Các bài đã đăng
   - Nếu @Status=-1 => Các bài chờ đăng
   - Nếu @Status=0 => Không Set
+ Chuyên mục
   - Nếu @CateID>0 => Tìm theo điều kiện CateID
+ Từ khóa
    Ở đây mình tìm kiếm theo điều kiện LIKE ở trường Title và trường Description (Nếu bạn cần tìm theo các trường khác thì bạn có thể thay đồi)
Thủ tục tìm kiếm minh họa như sau

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

-- Author:        webmaster@hmweb.com.vn

-- Description:   <Tìm kiếm bài viết theo điều kiện>

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

CREATE PROCEDURE spTB_News_Search

@Status int,

@CateID int,

@Keyword nvarchar(255)

AS

BEGIN

      -- Khai báo chuỗi truy vấn

      DECLARE @SQL nvarchar(4000)

      SET @SQL =''

      SET @SQL =@SQL+ N'

            SELECT    

            TB_Category.CateID,

            TB_Category.CateName,

            TB_News.idNews,

            TB_News.UserName,

            TB_News.Title,

            TB_News.Description,

            TB_News.Content,

            TB_News.Author,

            TB_News.Picture,

            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

            FROM         TB_Category INNER JOIN

            TB_News ON TB_Category.CateID = TB_News.CateID WHERE ''1''=''1'''



            --Khai báo điều kiện tìm kiếm

            DECLARE @SQLWhere nvarchar(4000)

            SET @SQLWhere=''



            -- Nếu @Status=1 thì tìm điều kiện Status=1 (Đã đăng)

            IF @Status=1

                  SET @SQLWhere=@SQLWhere+ N' AND TB_News.Status =1 '

            -- Nếu @Status=-1 thì tìm điều kiện Status=0 (Chờ đăng)    

            IF @Status=-1

                  SET @SQLWhere =@SQLWhere+ ' AND TB_News.Status =0 '

            -- Tìm kiếm theo chuyên mục nếu @CateID>0

            IF @CateID>0

                  SET @SQLWhere =@SQLWhere+ ' AND TB_News.CateID = '+cast(@CateID AS char(20)) +''

            -- Tìm kiếm theo từ khóa

            IF @Keyword<>''

                  SET @SQLWhere =@SQLWhere+ '

                  AND ( TB_News.Title LIKE ''%'+@Keyword+ '%''

                  OR TB_News.Description  LIKE ''%'+@Keyword+ '%'')'



            -- Khai báo Chuỗi thực thi tìm kiếm

            DECLARE @SQLEXEC nvarchar(4000)

            -- Kết hợp điều kiện tìm kiếm vào chuỗi truy vấn

            SET @SQLEXEC=@SQL+@SQLWhere  

            -- Thực thi điều kiện tìm kiếm và trả về dữ liệu nếu có

            EXEC sp_executesql @SQLEXEC

 --PRINT @SQLEXEC

END