2011-01-29 44 views
1

我有一個存儲過程,根據文章的標題查找文章。但是我也需要在同一個表中增加一列來計算文章被查看的次數。沒有多次查找返回數據和更新行?

試圖儘可能地高效,我看到了兩個可能的方法來處理這個:

  1. 執行一個SELECT來獲得對目標行的PK。然後使用該PK來增加視圖的數量,最後使用PK返回文章數據。

  2. 執行一個SELECT文章數據返回到我的應用程序,然後使用返回的PK再拍往返於數據庫遞增的若干意見。

我知道#1會很快,但它是三次查找。 #2需要兩次往返數據庫。有沒有辦法來優化這個任務?

編輯意見的基礎上,我提出了以下幾點。感謝您的任何評論或建設性的批評。

DECLARE @Slug VARCHAR(250) -- Stored procedure argument 

-- declare @UpdatedArticle table variable 
DECLARE @UpdatedArticle TABLE 
(
    ArtID INT, 
    ArtUserID UNIQUEIDENTIFIER, 
    ArtSubcategoryID INT, 
    ArtTitle VARCHAR(250), 
    ArtHtml VARCHAR(MAX), 
    ArtDescription VARCHAR(350), 
    ArtKeywords VARCHAR(250), 
    ArtLicenseID VARCHAR(10), 
    ArtViews BIGINT, 
    ArtCreated DATETIME2(7), 
    ArtUpdated DATETIME2(7) 
); 

UPDATE Article 
    SET ArtViews = ArtViews + 1 
OUTPUT 
    INSERTED.ArtID, 
    INSERTED.ArtUserID, 
    inserted.ArtSubcategoryID, 
    INSERTED.ArtTitle, 
    INSERTED.ArtHtml, 
    INSERTED.ArtDescription, 
    INSERTED.ArtKeywords, 
    INSERTED.ArtLicenseID, 
    INSERTED.ArtViews, 
    INSERTED.ArtUpdated, 
    INSERTED.ArtCreated 
INTO @UpdatedArticle 
WHERE ArtSlugHash = CHECKSUM(@Slug) AND ArtSlug = @Slug AND ArtApproved = 1 

SELECT a.ArtID, a.ArtUserID, a.ArtTitle, a.ArtHtml, a.ArtDescription, a.ArtKeywords, a.ArtLicenseID, 
    l.licTitle, a.ArtViews, a.ArtCreated, a.ArtUpdated, s.SubID, s.SubTitle, c.CatID, c.CatTitle, 
    sec.SecID, sec.SecTitle, u.UsrDisplayName AS UserName 
    FROM @UpdatedArticle a 
    INNER JOIN Subcategory s ON a.ArtSubcategoryID = s.SubID 
    INNER JOIN Category c ON s.SubCatID = c.CatID 
    INNER JOIN [Section] sec ON c.CatSectionID = sec.SecID 
    INNER JOIN [User] u ON a.ArtUserID = u.UsrID 
    INNER JOIN License l ON a.ArtLicenseID = l.LicID 

回答

2

下面是一個使用OUTPUT語句(SQL服務器2005年起)的方式,在一個更新語句:

IF OBJECT_ID ('Books', 'U') IS NOT NULL 
    DROP TABLE dbo.Books; 

CREATE TABLE dbo.Books 
(
    BookID int NOT NULL PRIMARY KEY, 
    BookTitle nvarchar(50) NOT NULL, 
    ModifiedDate datetime NOT NULL, 
    NumViews int not null CONSTRAINT DF_Numviews DEFAULT (0) 
); 

INSERT INTO dbo.Books 
    (BookID, BookTitle, ModifiedDate) 
VALUES 
    (106, 'abc', GETDATE()), 
    (107, 'Great Expectations', GETDATE()); 


-- declare @UpdateOutput1 table variable 
DECLARE @UpdateOutput1 table 
(
    BookID int, 
    BookTitle nvarchar(50), 
    ModifiedDate datetime, 
    NumViews int 
); 


-- >>>> here is the update of Numviews and the Fetch 
-- update Numviews in Books table, and retrive the row 
UPDATE Books 
SET 
    NumViews = NumViews + 1 
OUTPUT 
    INSERTED.BookID, 
    INSERTED.BookTitle, 
    INSERTED.ModifiedDate, 
    INSERTED.NumViews 
    INTO @UpdateOutput1 
WHERE BookID = 106 

-- view updated row in Books table 
SELECT * FROM Books; 

-- view output row in @UpdateOutput1 variable 
SELECT * FROM @UpdateOutput1; 
+0

謝謝,我不熟悉這一點。我會很感激我的修改後的代碼的任何意見,我已經附加到我的問題。此外,它似乎工作正常,當沒有行匹配的初始標準,但要確保我不丟失任何東西。 – 2011-01-29 06:51:43

相關問題