MS-SQL查询 - 通过存储过程检索的更新记录

时间:2011-07-11 17:26:16

标签: sql-server sql-server-2005 tsql

* 更新*

范围现在略有发展,我现在需要检索字段'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”,以便检索单个结果。在同一程序中执行此操作的最简单/最快的方法是什么?

提前感谢您提供的任何帮助。

2 个答案:

答案 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

UPDATE (Transact-SQL)说:

  

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;