Sql server 是否返回数据并更新行而不进行多次查找?
我有一个存储过程,它根据文章的标题查找文章。但我还需要在同一个表中增加一列,计算文章的浏览次数 为了尽可能提高效率,我认为有两种方法可以实现这一点:Sql server 是否返回数据并更新行而不进行多次查找?,sql-server,Sql Server,我有一个存储过程,它根据文章的标题查找文章。但我还需要在同一个表中增加一列,计算文章的浏览次数 为了尽可能提高效率,我认为有两种方法可以实现这一点: 执行一次选择以获得目标行上的PK。然后使用该主键增加视图数量,最后,使用该主键选择另一个选项以返回文章数据 执行一次SELECT将文章数据返回到我的应用程序,然后使用返回的PK再次往返数据库以增加视图数 我知道#1会很快,但需要三次查找。#2需要两次往返数据库。没有办法优化此任务吗 编辑根据反馈,我提出了以下建议。谢谢你的评论或建设性的批评 DEC
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;
谢谢,我不熟悉这个。如果您对我修改过的代码有任何意见,我将不胜感激,我已将其添加到我的问题中。此外,当没有行与初始条件匹配时,它似乎工作得很好,但希望确保我没有遗漏任何内容。