MS-SQL Query - обновление записи, полученной с помощью хранимой процедуры - PullRequest
1 голос
/ 11 июля 2011

* ОБНОВЛЕНИЕ *

Область действия теперь немного развита, и теперь мне нужно получить поля 'Id, uri, linkTo'.Как это меняет положение вещей?

Я использую базу данных MS-SQL 2005 и имею следующую хранимую процедуру:

CREATE PROCEDURE dbo.getNewAds
(
@region
)
AS
BEGIN
SELECT TOP 1 Id, uri, linkTo FROM Adverts
ORDER BY NEWID()
WHERE adRegion = @region
END

Я хотел бы добавить '1' кстолбец с именем adShown в той же таблице, для одного полученного результата.Какой самый простой / быстрый способ сделать это в рамках одной и той же процедуры?

Заранее благодарим за любую помощь, которую вы можете предложить.

Ответы [ 2 ]

7 голосов
/ 11 июля 2011

попробуйте одну команду:

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, UPDATE, MERGE или DELETE , расположены не в любом порядке.

, но в моем ограниченном тестировании (не так много строк в тестовой таблице), похоже, что он обновляет одну и ту же строку каждый раз, и что ОП пытается обновлять разные строки каждый раз.

поэтому попробуйте это:

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
2 голосов
/ 11 июля 2011

Существует причудливый синтаксис обновления, который позволит вам присвоить значение переменной одновременно с выполнением обновления, но я не собираюсь показывать его вам, поскольку оно недокументировано, не поддерживается, и я могу 'Гарантируйте, что это продолжит работать в будущих версиях 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...