80

私は更新と選択を実行しようとしています...基本的に、インデックスに基づいて更新し、更新された行IDを選択します。

これは、OUTPUT 句を使用すると簡単です。

UPDATE Foo
SET Bar = 1
OUTPUT INSERTED.Id
WHERE Baz = 2

しかし今、どうすればこれを変数に入れることができますか?

DECLARE @id INT

次の 3 つは機能しません。

UPDATE Foo
SET Bar = 1
OUTPUT @id = INSERTED.Id
WHERE Baz = 2

SET @id =
(UPDATE Foo
 SET Bar = 1
 OUTPUT INSERTED.Id
 WHERE Baz = 2)

SET @id =
(SELECT Id FROM (UPDATE Foo
                 SET Bar = 1
                 OUTPUT INSERTED.Id Id
                 WHERE Baz = 2) z)

最後の 1 つが含まれているのは、Management Studio ですべての赤い波線が消えたときに一時的に興奮したからです。残念ながら、次のエラーが表示されます。

A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement.
4

3 に答える 3

103

更新は複数の行に影響を与える可能性があるため、結果を格納するテーブルが必要です。

declare @ids table (id int);

UPDATE Foo
SET Bar = 1
OUTPUT INSERTED.Id INTO @ids
WHERE Baz = 2

影響を受けるのが 1 行だけであることが確実な場合は、次のように ID を引き出すことができます。

declare @id int
select  top 1 @id = id
from    @ids
于 2013-05-30T23:12:10.000 に答える