2011-07-11 129 views
0

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

范围现在已经略有发展,我现在需要中检索的字段的标识,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

有一种古怪的更新语法,可以让您在执行更新的同时将值赋给变量,但我不打算向您显示它,因为它没有记录,不受支持,而且我可以不保证它将继续在SQL Server的未来版本中工作。下面是我建议的方法(假设编号是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; 
+0

感谢您的答复。我已获得更多信息,现在还需要检索列'id,uri,linkTo'。我试图在@ ID = id后添加这些内容,但得到错误;一个给变量赋值的SELECT语句不能与数据检索操作结合使用。 –

+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]

指定要更新的行数或百分比。表达式可以是行数的百分之一或百分比。

与INSERT, UPDATE,MERGE或DELETE 一起使用的TOP表达式中引用的行未按任何顺序排列。

但在我有限的测试(测试表不是很多行),它看起来像它每一次更新同一行,那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 [email protected] 
END 
+0

@KM感谢您的回复。我已获得更多信息,现在还需要检索列'id,uri,linkTo'。我试图在@ ID = id后添加这些内容,但得到错误;一个给变量赋值的SELECT语句不能与数据检索操作结合使用。 –

+0

+1输出。从来不是我的第一个倾向 –

+0

@Phill Healey,只需选择@ID列,因为它已经在做。然而,在UPDATE的OUTPUT子句中包含你想要的列:'INSERTED.ID,INSERTED.Uri,INSERTED.LinkTO',你的结果集将包含那些列。 –