Sql server 是否返回数据并更新行而不进行多次查找?

Sql server 是否返回数据并更新行而不进行多次查找?,sql-server,Sql Server,我有一个存储过程,它根据文章的标题查找文章。但我还需要在同一个表中增加一列,计算文章的浏览次数 为了尽可能提高效率,我认为有两种方法可以实现这一点: 执行一次选择以获得目标行上的PK。然后使用该主键增加视图数量,最后,使用该主键选择另一个选项以返回文章数据 执行一次SELECT将文章数据返回到我的应用程序,然后使用返回的PK再次往返数据库以增加视图数 我知道#1会很快,但需要三次查找。#2需要两次往返数据库。没有办法优化此任务吗 编辑根据反馈,我提出了以下建议。谢谢你的评论或建设性的批评 DEC

我有一个存储过程,它根据文章的标题查找文章。但我还需要在同一个表中增加一列,计算文章的浏览次数

为了尽可能提高效率,我认为有两种方法可以实现这一点:

  • 执行一次选择以获得目标行上的PK。然后使用该主键增加视图数量,最后,使用该主键选择另一个选项以返回文章数据

  • 执行一次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
    

    以下是在单个update语句中使用OUTPUT语句(SQL Server 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;
    

    谢谢,我不熟悉这个。如果您对我修改过的代码有任何意见,我将不胜感激,我已将其添加到我的问题中。此外,当没有行与初始条件匹配时,它似乎工作得很好,但希望确保我没有遗漏任何内容。