*UPDATE *
The scope has now developed slightly, and I now need to retreive the fields \'Id, uri, linkTo\'. How does this change things???
I\'m u
try a single command:
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) says that:
TOP ( expression) [ PERCENT ]
Specifies the number or percent of rows that will be updated. expression can be either a number or a percent of the rows.
The rows referenced in the TOP expression that is used with INSERT, UPDATE, MERGE, or DELETE are not arranged in any order.
but in my limited testing (not many rows in the test table), it looks like it updates the same row each time, and that the OP is trying to update a different row each time.
so try this:
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
There is a quirky update syntax that will let you assign the value to a variable at the same time as performing an update, but I'm not going to show it to you because it is undocumented, unsupported, and I can't guarantee that it will continue to work in future versions of SQL Server. Here is the method I would recommend (assuming Id is PK or at least unique):
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;