2011-07-11 18 views
0

* UPDATE経由で取得したレコードを更新します*MS-SQLクエリ - ストアドプロシージャ

スコープは今少し開発している、と私は今、フィールドのID、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の将来のバージョンでも引き続き動作することを保証しません。ここで私は(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; 
+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]

更新される行の数または割合を指定します。 expressionは、行の数またはパーセントのいずれかになります。

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')が含まれ、結果セットにはこれらの列が含まれます。 –

関連する問題