Вихідний пункт 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 від @ID". Мені хотілося знати, чи можливо пропустити цей додатковий крок (і змінну таблиці посередника), якщо все, що мені потрібно, - це результат, що вводиться.
Benoittr

@Benoittr - Це залежить від того, як ви будете використовувати значення, це може не бути необхідним, ви можете використовувати таблицю в пункті з вибору оператора select. Призначаючи змінну, ви також повинні бути впевнені, що вставку вставлено лише один рядок. І якщо вкладиш вставив лише один рядок, можливо, простіше здобути те, що використовується в пункті значень безпосередньо, а не використовувати output?
Mikael Eriksson

4
У випадку з автоматично згенерованим значенням не завжди можливо знати значення достроково (ідентичність, обчислені стовпці). Я розумію, що існує багато рішень. Ти все-таки ти дав мені відповідь, яку я шукав. Спасибі
Бенуітр

Потрібна вона в звичайній змінній? 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);
Арво Боуен

30

Через рік ... якщо вам потрібно отримати автоматично створений ідентифікатор таблиці, ви можете просто

SELECT @ReportOptionId = SCOPE_IDENTITY()

В іншому випадку здається, що ви застрягли з використанням таблиці.


6
Змінна, яку я шукав насправді, була чимось іншою, ніж стовпець ідентичності. Все-таки дякую за відповідь.
Benoittr

26
Мабуть, це має проблеми в багатопроцесорному паралельному плані, а вихідний вихід - єдиний завжди надійний метод.
andrewb

6
SCOPE_IDENTITY () може щось повернути, навіть якщо останній INSERT нічого не вставив, правда? Це зробило б його непридатним у деяких випадках.
Патрік Онорез

2
краще використовувати вихідний пункт
Clay Smith

1
Помилка @andrewb відноситься до виправленої у R2 SP1 2008 року .
adam0101

6

Шлях пізніше, але все-таки варто згадати, що ви також можете використовувати змінні для виведення значень у пункті SET UPDATE або в полях 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, тож у цьому випадку вам доведеться перейти з таблицею виводу. Що стосується всього, окрім найпростішого випадку, я думаю, що таблиця виводу також буде читабельнішою у вашому коді.

Це дуже корисне місце, якщо ви хочете перетворити стовпець у список, розділений комами;

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.
Сем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.