Skaler değişkene SQL Server Çıktı Maddesi


134

Bunu yapmanın herhangi bir "basit" yolu var mı, yoksa "OUTPUT ... INTO" sözdizimi ile bir tablo değişkeninden geçmem gerekiyor mu?

DECLARE @someInt int

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

Yanıtlar:


161

Bir tablo değişkenine ihtiyacınız var ve bu kadar basit olabilir.

declare @ID table (ID int)

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

45
Ama sonra "SELECT @someInt = ID FROM @ID" yapmam gerekir. İhtiyacım olan tek şey sonuçta ortaya çıkan int ise, bu ekstra adımı (ve ara tablo değişkenini) atlamanın mümkün olup olmadığını bilmek istedim.
Benoittr

@Benoittr - Bu, değeri nasıl kullanacağınıza bağlı, gerekli olmayabilir, tabloyu bir select ifadesinin bir from cümlesinde kullanabilirsiniz. Bir değişken atadığınızda, ekin yalnızca bir satır eklediğinden de emin olmanız gerekir. Ve eğer ekleme sadece bir satır eklediyse, belki de kullanmak yerine değerler cümlesinde neyin kullanıldığını doğrudan elde etmek daha kolaydır output?
Mikael Eriksson

4
Otomatik olarak oluşturulan değer durumunda, değerleri önceden bilmek her zaman mümkün değildir (kimlik, hesaplanan sütunlar). Anladığım kadarıyla birçok geçici çözüm var. Yine de bana aradığım cevabı verdin. Teşekkürler
Benoittr

Düzenli bir değişkende mi ihtiyacınız var? 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

Bir yıldan fazla bir süre sonra ... ihtiyacınız olan şey bir tablonun otomatik olarak oluşturulan kimliğini almaksa,

SELECT @ReportOptionId = SCOPE_IDENTITY()

Aksi takdirde, bir tablo kullanmak zorunda kalmışsınız gibi görünüyor.


6
Aradığım değişken gerçekten başka bir şeydi, sonra kimlik sütunuydu. Yine de cevap için teşekkürler.
Benoittr

26
Görünüşe göre bunun Çok İşlemcili Paralel Plan'da sorunları var ve OUTPUT her zaman güvenilir olan tek yöntem.
andrewb

6
SCOPE_IDENTITY (), son INSERT hiçbir şey eklemese bile bir şey döndürebilir , değil mi? Bu, bazı durumlarda onu kullanılamaz hale getirir.
Patrick Honorez

2
çıktı maddesini kullanmak daha iyi
Clay Smith

1
@Andrewb'ın başvurduğu hata 2008 R2 SP1'de düzeltilmiştir .
adam0101

6

Daha sonra, ancak yine de bahsetmeye değer, değişkenleri bir UPDATE'in SET yan tümcesinde veya bir SELECT'in alanlarında değerleri çıkarmak için de kullanabileceğinizdir;

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

Yukarıdaki örnekte @ val1 önceki değere sahiptir ve @ val2 sonraki değere sahiptir, ancak bir tetikleyiciden herhangi bir değişikliğin val2'de olmayacağından şüpheleniyorum, bu durumda çıktı tablosuna gitmeniz gerekir. En basit durum dışında herhangi bir şey için, çıktı tablosunun kodunuzda daha okunabilir olacağını düşünüyorum.

Bunun çok yararlı olduğu yerlerden biri, bir sütunu virgülle ayrılmış bir listeye dönüştürmek istiyorsanız;

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

Teşekkürler! İhtiyacım olan bilgi
buydu

1
VAOV! Yapabileceğini bilmiyordum SET @val2 = NextNum = NextNum + 1.
Sam

Sorulandan tamamen farklı , hiç yardımcı olmadı, çünkü soruyu soran tarafından sorulan yaklaşımı kullanarak OUTPUTbir INSERTmaddede bir değişkene bir değer atamanın bir yolunu arıyordum INSERT-OUTPUT-VALUES.
Fwd079
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.