SQL Server出力句をスカラー変数に


134

これを行う「簡単な」方法はありますか、または「OUTPUT ... INTO」構文でテーブル変数を渡す必要がありますか?

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

回答:


161

テーブル変数が必要ですが、これは簡単なことです。

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

45
しかし、「SELECT @someInt = ID FROM @ID」を選択する必要があります。必要なのが結果のintだけである場合、その追加の手順(および中間テーブル変数)をスキップすることが可能かどうかを知りたかったのです。
Benoittr

@Benoittr-値をどのように使用するかによって異なりますが、必要ない場合もあります。selectステートメントのfrom句でテーブルを使用できます。変数を割り当てるときは、挿入によって1行だけが挿入されることも確認する必要があります。また、挿入で1行しか挿入されなかった場合は、?を使用するよりも、values句で使用されているものを直接取得する方が簡単outputです。
ミカエルエリクソン

4
自動生成された値の場合、事前に値(ID、計算された列)を常に知ることができるとは限りません。多くの回避策があることを理解しています。それでも、あなたは私が探していた答えをくれました。ありがとう
Benoittr

通常の変数でそれが必要ですか? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
Arvo Bowen

30

1年以上後...テーブルの自動生成されたIDを取得する必要がある場合は、

SELECT @ReportOptionId = SCOPE_IDENTITY()

それ以外の場合は、テーブルの使用に悩まされているようです。


6
私が探していた変数は、ID列以外のものでした。それでも、答えてくれてありがとう。
Benoittr 2012

26
どうやらこれはマルチプロセッサパラレルプランに問題があり、OUTPUTが唯一の常に信頼できる方法です。
アンドリューブ2014年

6
SCOPE_IDENTITY()は、最後の INSERTが何も挿入していなくても、何かを返すことがありますよね?場合によっては使用できなくなります。
Patrick Honorez、2015年

2
出力句を使用することをお勧めします
クレイ・スミス

1
@andrewbが参照するバグは、2008 R2 SP1で修正されています。
adam0101

6

後で説明しますが、UPDATEのSET句またはSELECTのフィールドで変数を使用して値を出力することもできます。

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

上記の例では、@ val1には変更前の値があり、@ val2には変更後の値がありますが、トリガーからの変更はval2には含まれないと思われるため、その場合は出力テーブルを使用する必要があります。最も単純な場合以外は、出力テーブルもコードで読みやすくなると思います。

これが非常に役立つ1つの場所は、列をコンマ区切りのリストに変換する場合です。

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

ありがとう!これは私が必要とした情報でした
Wizou

1
うわー!できるか知らなかったSET @val2 = NextNum = NextNum + 1
サム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.