2009-03-20 23 views
6

Tài liệu MSDN không hoàn toàn rõ ràng trên tài liệu này. hoặc có lẽ tôi không đọc chúng đủ tốt.Điều gì sẽ xảy ra nếu tôi Chọn SCOPE_IDENTITY() sau khi chèn không thành công (SQL Server 2005)

Nếu tôi làm một chèn (có thể chèn zero hàng), tiếp theo là

;SELECT SCOPE_IDENTITY() 

Và sau đó gọi các lệnh bằng cách ExecuteScalar() ...

gì kết quả sẽ là nếu Insert không chèn bất kỳ hàng nào?

Tôi muốn dừng nếu không thành công để tôi không tiếp tục chèn bản ghi con vào ID gốc không đúng hoặc sai.

+1

Đừng quên về lỗi thực hiện song song tồn tại trong SQL Server cho SCOPE_IDENTITY và @@ SẮC: http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

Trả lời

11

Nếu không có Mã định danh được chèn vào SCOPE_IDENTITY() sẽ trả về giá trị rỗng, bạn có thể kiểm tra điều kiện bạn chỉ định bằng cách gán SCOPE_IDENTITY() cho biến và sau đó kiểm tra nội dung biến.

Minh họa

Create Proc SomeInsertToFail(@ID int OUTPUT) 
as 
Begin 
    Select @ID = Scope_Identity() 
End 
Declare @SOMEID int 
Exec SomeInsertToFail @SOMEID OUTPUT 
Select @SOMEID --This will yield null 
+0

vì vậy tôi có thể thực hiện SELECT IsNull (Scope_Identity(), -1) để tôi luôn nhận được INT hợp lệ và giá trị lỗi không thể là một ID thực tế? (giả định tất nhiên danh tính của tôi bắt đầu tại 1) –

+3

có thể là giá trị thử nghiệm trên một số kịch bản bí truyền hơn ... INSERT trên một bảng nơi một kích hoạt duy trì tính nguyên vẹn và đưa ra một lỗi để ngăn chặn việc chèn ... – MatBailie

+0

@Dems, thats a interesting thử nghiệm, tôi sẽ thử. –

3

NULL

nguồn: đã một SCOPE_IDENTITY SELECT() trên một truy vấn trống (aka không chèn)

3

Nó phụ thuộc vào việc đã có sự chèn SUCCESSFUL trong phạm vi hiện tại.

declare @tb table (i int identity, ky varchar(100)); 

insert into @tb values('Success'); 

insert into @tb select ky from @tb where ky = 'Failure'; 

select SCOPE_IDENTITY(); -- returns 1 
select * from @tb 
Các vấn đề liên quan