2009-03-31 39 views
47

Tôi cần cập nhật hàng trong bảng và nhận giá trị cột từ cột đó. Tôi có thể làm điều này vớiSQL: Cập nhật hàng và trả về giá trị cột với 1 truy vấn

UPDATE Items SET Clicks = Clicks + 1 WHERE Id = @Id; 
SELECT Name FROM Items WHERE Id = @Id 

Điều này tạo ra 2 gói/quyền truy cập vào bảng. Là possibile trong T-SQL để sửa đổi các báo cáo UPDATE để cập nhật và trả về cột tên với 1 kế hoạch/truy cập chỉ?

Tôi đang sử dụng phương pháp C#, ADO.NET ExecuteScalar() hoặc ExecuteReader().

Trả lời

87

Bạn muốn OUTPUT khoản

UPDATE Items SET Clicks = Clicks + 1 
OUTPUT INSERTED.Name 
WHERE Id = @Id 
+0

Tôi đoán điều này chỉ hoạt động cho SQL-2005 –

+0

Và ở trên, có. Với SQL Server 2000, xem Phản hồi của Học tập –

+1

IIRC, mệnh đề OUTPUT được giới thiệu như một phần của Nhà môi giới Dịch vụ SQL Server 2005 - http://msdn.microsoft.com/en-us/library/ms345108.aspx –

0

Sử dụng quy trình được lưu trữ cho việc này.

0

Tạo một thủ tục được lưu trữ để lấy @id làm tham số và thực hiện cả hai thứ đó. Sau đó, bạn sử dụng DbDataAdapter để gọi thủ tục được lưu trữ.

17

truy cập vào bảng chỉ một lần:

UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id; 
select @name; 
+0

Phương pháp của Marc tốt hơn nhiều vì truy vấn của tôi vốn giả định rằng có một tên cho một Id có thể/không đúng. – Learning

+1

Cách tiếp cận này không yêu cầu sử dụng biến bảng. – crokusek

+0

Cách tiếp cận này là tốt hơn, bởi vì nó không phụ thuộc vào trình kích hoạt bảng. –

3

Nếu bạn đang sử dụng SQL Server 2005 trở đi, các OUTPUT clause là lý tưởng cho việc này

0

tôi có thể không quản lý để cập nhật và trả về một hàng bên trong câu lệnh chọn. Tức là bạn không thể sử dụng giá trị đã chọn từ các câu trả lời khác.

Trong trường hợp của tôi, tôi muốn sử dụng giá trị đã chọn trong truy vấn. Giải pháp mà tôi đưa ra là:

declare @NextId int 
set @NextId = (select Setting from Settings where key = 'NextId') 

select @NextId + ROW_NUMBER() over (order by SomeColumnOfYourTable) from YourTable 

update Settings set Setting = Setting + @@ROWCOUNT 
where key = 'NextId' 
Các vấn đề liên quan