2011-07-11 128 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',你的結果集將包含那些列。 –