SQL Server Output Clause menjadi variabel skalar

134

Apakah ada cara "sederhana" untuk melakukan ini atau saya harus melewati variabel tabel dengan sintaks "OUTPUT ... INTO"?

DECLARE @someInt int

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

Jawaban:

161

Anda memerlukan variabel tabel dan bisa sesederhana ini.

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)
Mikael Eriksson
sumber
45
Tapi kemudian saya harus "SELECT @someInt = ID FROM @ID". Saya ingin tahu apakah mungkin untuk melewati langkah tambahan (dan variabel tabel perantara) jika semua yang saya butuhkan adalah int yang dihasilkan.
Benoittr
@Benoittr - Itu tergantung pada bagaimana Anda akan menggunakan nilai, mungkin tidak perlu, Anda bisa menggunakan tabel dalam dari klausa pernyataan pilih. Saat Anda menetapkan variabel, Anda juga perlu memastikan bahwa sisipan hanya memasukkan satu baris. Dan jika sisipan hanya memasukkan satu baris, mungkin lebih mudah untuk mengetahui apa yang digunakan dalam klausa nilai secara langsung daripada menggunakan output?
Mikael Eriksson
4
Dalam hal nilai yang dihasilkan secara otomatis, tidak selalu mungkin untuk mengetahui nilai sebelumnya (identitas, kolom yang dihitung). Saya mengerti ada banyak solusi. Tetap saja, Anda memberi saya jawaban yang saya cari. Terima kasih
Benoittr
Perlu dalam variabel reguler? 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

Lebih dari setahun kemudian ... jika yang Anda butuhkan adalah mendapatkan id tabel yang dibuat secara otomatis, Anda bisa saja

SELECT @ReportOptionId = SCOPE_IDENTITY()

Kalau tidak, sepertinya Anda terjebak menggunakan tabel.

Alejandro B.
sumber
6
Variabel yang saya cari sebenarnya adalah sesuatu yang lain daripada kolom identitas. Tetap saja, terima kasih atas jawabannya.
Benoittr
26
Rupanya ini memiliki masalah dalam Rencana Paralel Multi Prosesor, dan OUTPUT adalah satu-satunya metode yang selalu dapat dipercaya.
andrewb
6
SCOPE_IDENTITY () dapat mengembalikan sesuatu meskipun INSERT terakhir tidak memasukkan apa pun, bukan? Itu akan membuatnya tidak dapat digunakan dalam beberapa kasus.
Patrick Honorez
2
lebih baik menggunakan klausa output
Clay Smith
1
Bug @andrewb merujuk diperbaiki pada 2008 R2 SP1 .
adam0101
6

Cara kemudian tetapi masih layak disebutkan adalah bahwa Anda juga dapat menggunakan variabel untuk menghasilkan nilai dalam klausa SET dari UPDATE atau dalam bidang 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

Dalam contoh di atas @ val1 memiliki nilai sebelum dan @ val2 memiliki nilai setelah walaupun saya menduga perubahan dari pemicu tidak akan di val2 jadi Anda harus pergi dengan tabel output dalam kasus itu. Untuk apa pun kecuali kasus paling sederhana, saya pikir tabel output akan lebih mudah dibaca dalam kode Anda juga.

Satu tempat ini sangat membantu adalah jika Anda ingin mengubah kolom menjadi daftar yang dipisahkan koma;

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list
Jay13
sumber
Terima kasih! Ini adalah info yang saya butuhkan
Wizou
1
WOW! Saya tidak tahu Anda bisa melakukannya SET @val2 = NextNum = NextNum + 1.
Sam