2012-03-04 34 views
14

Tôi đã cố gắng viết một thủ tục đã lưu trước tiên chèn một bản ghi mới vào bảng và sau đó trả về id của bản ghi mới này. Tôi không chắc đó có phải là cách chính xác hay không và cách tốt nhất để đạt được điều này.Cần một thủ tục lưu sẵn để chèn một hàng và trả về mã số

ALTER PROCEDURE dbo.spAddAsset 
(
@Name VARCHAR(500), 
@URL VARCHAR(2000) 
) 
AS 
BEGIN 
Set NOCOUNT on; 

Insert Into Assets (Name, URL) Values (@Name, @URL) 

Declare @new_identity int; 

SELECT @new_identity = SCOPE_IDENTITY() 

return @new_identity; 
END 
+0

Xin lỗi. Tôi sẽ bỏ phiếu phần còn lại. –

Trả lời

27

Để trả về một giá trị vô hướng duy nhất để người gọi bạn nên sử dụng một tham số OUTPUT, không RETURN. RETURN là mã lỗi/trạng thái. Cũng tiền tố sp là dư thừa và không cần thiết.

CREATE PROCEDURE dbo.AddAsset 
    @Name VARCHAR(500), 
    @URL VARCHAR(2000), 
    @new_identity INT = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.Assets(Name, URL) SELECT @Name, @URL; 
    SET @new_identity = SCOPE_IDENTITY(); 
END 
GO 

Sau đó, để gọi nó là:

DECLARE @new_identity INT; 
EXEC dbo.AddAsset @Name = 'a', @URL = 'b', @new_identity = @new_identity OUTPUT; 
PRINT @new_identity; 

EDIT chỉ cần thêm một từ chối trách nhiệm đó sẽ không ảnh hưởng đến hỏi trong tình huống cụ thể này, nhưng có thể giúp trong các kịch bản khác hoặc cho độc giả trong tương lai. Trong SQL Server 2008 R2 và trước đó, có một potentially nasty bug với các hàm dựng sẵn như SCOPE_IDENTITY khi song song được sử dụng để lấy được kết quả được chèn vào (suy nghĩ INSERT FROM othertable). Lỗi này (here is the Connect item) được sửa trong Cumulative Update #5 for SQL Server 2008 R2 SP1, nhưng cho đến nay bản sửa lỗi chưa xuất hiện cho 2008 R2 RTM, 2008 hoặc 2005.

+0

hi, làm cách nào để tôi trả lại tập hợp nhiều bản ghi mà tôi đã thêm (tôi có XML làm nguồn đầu vào)? – godblessstrawberry

Các vấn đề liên quan