* 更新*
范围现在略有发展,我现在需要检索字段'Id,uri,linkTo'。这怎么改变了呢?
我正在使用MS-SQL 2005 db并具有以下存储过程;
CREATE PROCEDURE dbo.getNewAds
(
@region
)
AS
BEGIN
SELECT TOP 1 Id, uri, linkTo FROM Adverts
ORDER BY NEWID()
WHERE adRegion = @region
END
我想在同一个表中为名为adShown的列添加“1”,以便检索单个结果。在同一程序中执行此操作的最简单/最快的方法是什么?
提前感谢您提供的任何帮助。
答案 0 :(得分:7)
尝试一个命令:
CREATE PROCEDURE dbo.getNewAds
(
@region --lazy, declare type!!
)
AS
BEGIN
UPDATE TOP (1) Adverts
SET adShown = adShown + 1
OUTPUT INSERTED.ID
WHERE adRegion = @region
END
TOP(表达)[PERCENT]
指定要更新的行数或百分比。 表达式可以是行的数量或百分比。
TOP表达式中引用的与INSERT一起使用的行, 更新,合并或删除不按任何顺序排列。
但是在我的有限测试中(测试表中没有很多行),它看起来每次都更新同一行,并且OP每次都试图更新不同的行。
所以试试这个:
CREATE PROCEDURE dbo.getNewAds
(
@region --lazy, declare type!!
)
AS
BEGIN
DECLARE @ID int
--select row to update
SELECT TOP 1
@ID=Id
FROM Adverts
WHERE adRegion = @region
ORDER BY NEWID()
--update and return result set in one command
UPDATE TOP (1) Adverts
SET adShown = adShown + 1
OUTPUT INSERTED.ID
WHERE ID=@ID
END
答案 1 :(得分:2)
有一种古怪的更新语法,可以让您在执行更新的同时将值分配给变量,但我不打算向您显示,因为它没有文档记录,不受支持,我可以' t保证它将继续在SQL Server的未来版本中工作。这是我推荐的方法(假设Id是PK或至少是唯一的):
DECLARE
@Id INT,
@uri VARCHAR(2048),
@linkTo VARCHAR(2048);
SELECT TOP 1 @Id = Id, @uri = uri, @linkTo = linkTo
FROM dbo.Adverts
WHERE adRegion = @region
ORDER BY NEWID();
UPDATE dbo.Adverts
SET adShown = adShown + 1
WHERE Id = @Id;
SELECT Id = @Id, uri = @uri, linkTo = @linkTo;