MS-SQL Query - Update record retrieved via Stored Procedure

前端 未结 2 831
时光说笑
时光说笑 2021-01-24 07:52

*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

相关标签:
2条回答
  • 2021-01-24 08:20

    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
    
    0 讨论(0)
  • 2021-01-24 08:34

    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;
    
    0 讨论(0)
提交回复
热议问题