2011-10-09 34 views
10

LinkThực thi nếu @@ rowcount> 0 đặt lại @@ rowcount thành 0. Tại sao?

@@ ROWCOUNT được sử dụng để thông báo cho số hàng bị ảnh hưởng cho người cuối cùng chọn, chèn, cập nhật hoặc xóa báo cáo

declare @row int select 100 if @@rowcount>0 set @[email protected]@rowcount ... 

trên sẽ trở về 0 vì càng sớm càng if @@rowcount>0 được thực hiện nó được đặt lại thành 0 vì nó không trả về bất kỳ hàng nào. Vì vậy, luôn luôn gán cho biến đầu tiên

Tại sao tuyên bố if @@rowcount>0 đặt lại @@rowcount để 0? Giá trị của @@rowcount chỉ bị ảnh hưởng bởi việc chọn, chèn, cập nhật và xóa câu lệnh?

cảm ơn bạn

Trả lời

11

Nó bị ảnh hưởng bởi tuyên bố cuối cùng. Giống như câu lệnh SET này

Declare @row int 
select 100 union all select 200 union all select 300 
set @row = @@rowcount; 
SELECT @row, @@rowcount 

Nếu bạn đọc actual Microsoft SQL Server Docs on MSDN, nó đưa ra ví dụ về những gì báo cáo ảnh hưởng đến @@ROWCOUNT. Ví dụ "như" ngụ ý báo cáo khác như NẾU cũng sẽ đặt nó vào không

cáo như SỬ DỤNG, SET <option>, deallocate CURSOR, CLOSE CURSOR, BEGIN TRANSACTION hoặc COMMIT GIAO DỊCH thiết lập lại giá trị ROWCOUNT để 0.

+0

1 - Theo như tôi hiểu, lý do tại sao @@ rowcount trả lại 1 và không phải 0 là do truy vấn "SELECT @row, @@ rowcount" ảnh hưởng đến một hàng. Nhưng tôi nghĩ thuật ngữ "số hàng bị ảnh hưởng" được sử dụng khi câu lệnh sql xử lý các hàng thực tế trong bảng DB, nhưng câu lệnh chọn của bạn không truy cập bất kỳ hàng nào, vậy tại sao @@ rowcount return 1? – user702769

+0

2 - Hy vọng câu hỏi này làm cho một số ý nghĩa - nếu chúng tôi đã nitpick, không @@ rowcount trả về số hàng ALREADY bị ảnh hưởng bởi tuyên bố chọn? Nếu vậy, sau đó "SELECT @row, @@ rowcount" phải trả về 0 cho @@ rowcount, vì câu lệnh select chưa được hoàn thành đầy đủ vào thời điểm nó lấy một giá trị từ @@ rowcount, và như vậy không có hàng nào bị ảnh hưởng chưa?! – user702769

+1

@ user702769: @@ rowcount trong 'SELECT @row, @@ rowcount' bị ảnh hưởng bởi' set @row = @@ rowcount; 'phía trên nó. Một SELECT không thể đọc được @@ rowcount – gbn

0

Vâng, Tôi gặp phải vấn đề tương tự khi sử dụng Sybase, cho biết có thể có sự cố với "nếu".

declare @counter1 int 
declare @counter2 int 

select @counter1 = @@rowcount 
if @@rowcount = 0 return 
select @counter2 = @@rowcount 

đầu ra là: counter1 = 3 counter2 = 0

Tôi mong chờ 3 (bản gốc) hoặc 1 (vì Select).

này thậm chí còn kỳ lạ hơn vì http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

"The @@ ROWCOUNT là không reset bằng không bởi bất kỳ tuyên bố mà không ảnh hưởng đến dòng, như một tuyên bố NẾU." Mặt khác, có rất nhiều sự nhầm lẫn về cách thức hoạt động của nó (dựa trên thảo luận trên internet)

Cuối cùng trong giải pháp đầu tiên tôi gán @@ rowcount cho biến và logic của tôi dựa trên biến đó

+0

Vâng, tôi đã rất ngạc nhiên khi khám phá ra (theo cách cứng) trong SQL Server @@ rowcount được thiết lập lại bằng câu lệnh "if". –

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