Điều khoản đầu ra của máy chủ SQL thành một biến vô hướng


134

Có cách nào "đơn giản" để làm điều này hay tôi cần chuyển qua một biến bảng với cú pháp "OUTPUT ... INTO"?

DECLARE @someInt int

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

Câu trả lời:


161

Bạn cần một biến bảng và nó có thể đơn giản.

declare @ID table (ID int)

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

45
Nhưng sau đó tôi phải "CHỌN @someInt = ID TỪ @ID". Tôi muốn biết nếu có thể bỏ qua bước bổ sung đó (và biến bảng trung gian) nếu tất cả những gì tôi cần là kết quả int.
Benoittr

@Benoittr - Điều đó phụ thuộc vào cách bạn sẽ sử dụng giá trị, nó có thể không cần thiết, bạn có thể sử dụng bảng trong mệnh đề from của một câu lệnh chọn. Khi bạn chỉ định một biến, bạn cũng cần chắc chắn rằng phần chèn chỉ được chèn một hàng. Và nếu chèn chỉ chèn một hàng, có lẽ việc nắm giữ trực tiếp những gì được sử dụng trong mệnh đề giá trị sẽ dễ dàng hơn thay vì sử dụng output?
Mikael Eriksson

4
Trong trường hợp giá trị được tạo tự động, không phải lúc nào cũng có thể biết các giá trị trước thời hạn (danh tính, cột được tính toán). Tôi hiểu có nhiều cách giải quyết. Tuy nhiên, bạn đã cho tôi câu trả lời tôi đang tìm kiếm. Cảm ơn
Benoittr

Cần nó trong một biến thường xuyên? 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

Hơn một năm sau ... nếu những gì bạn cần là lấy id được tạo tự động của bảng, bạn có thể chỉ cần

SELECT @ReportOptionId = SCOPE_IDENTITY()

Nếu không, có vẻ như bạn đang bị mắc kẹt với việc sử dụng bảng.


6
Biến tôi đang tìm kiếm thực sự là một cái gì đó khác sau đó là cột danh tính. Tuy nhiên, cảm ơn câu trả lời.
Benoittr

26
Rõ ràng điều này có vấn đề trong Kế hoạch song song đa bộ xử lý và OUTPUT là phương pháp duy nhất luôn đáng tin cậy.
andrewb

6
SCOPE_IDENTITY () có thể trả về một cái gì đó ngay cả khi INSERT cuối cùng không chèn bất cứ thứ gì, phải không? Điều đó sẽ làm cho nó không thể sử dụng trong một số trường hợp.
Patrick Honorez

2
tốt hơn để sử dụng mệnh đề đầu ra
Clay Smith

1
Lỗi @andrewb đề cập đến đã được sửa trong 2008 R2 SP1 .
adam0101

6

Cách sau nhưng vẫn đáng nói là bạn cũng có thể sử dụng các biến để xuất giá trị trong mệnh đề SET của CẬP NHẬT hoặc trong các trường của CHỌN;

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

Trong ví dụ trên @ val1 có giá trị trước và @ val2 có giá trị sau mặc dù tôi nghi ngờ bất kỳ thay đổi nào từ trình kích hoạt sẽ không nằm trong val2 nên bạn phải đi với bảng đầu ra trong trường hợp đó. Đối với bất cứ điều gì trừ trường hợp đơn giản nhất, tôi nghĩ rằng bảng đầu ra cũng sẽ dễ đọc hơn trong mã của bạn.

Một nơi rất hữu ích là nếu bạn muốn biến một cột thành một danh sách được phân tách bằng dấu phẩy;

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

Cảm ơn! Đây là thông tin tôi cần
Wizou 6/12/19

1
Ôi! Tôi không biết bạn có thể làm gì SET @val2 = NextNum = NextNum + 1.
Sam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.