Trong SQL Server, bạn có thể sử dụng SET ROWCOUNT
để giới hạn các hàng được trả về bởi một truy vấn.
Cách hoạt động là nó khiến SQL Server ngừng xử lý truy vấn sau khi trả về số hàng đã chỉ định.
Nó tương tự như TOP()
, nhưng với sự khác biệt là SET ROWCOUNT
được đặt bên ngoài truy vấn và sẽ ảnh hưởng đến tất cả các truy vấn tiếp theo.
Ví dụ
Đây là một ví dụ để chứng minh.
Trước tiên, hãy thực hiện một truy vấn không có cài đặt ROWCOUNT
.
SELECT * FROM Dogs;
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+ (4 rows affected)
Vì vậy, bốn hàng được trả về mà không cần đặt ROWCOUNT
.
Bây giờ, hãy sử dụng SET ROWCOUNT
để giới hạn số hàng, sau đó chạy lại truy vấn.
SET ROWCOUNT 2;
SELECT * FROM Dogs;
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Truy vấn Tiếp theo
Như đã đề cập, SET ROWCOUNT
ảnh hưởng đến tất cả các truy vấn tiếp theo.
Nếu tôi chạy truy vấn sau ngay sau truy vấn trước đó, hai hàng cũng được trả về.
SELECT * FROM Cats;
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Điều này là mặc dù thực tế là ba hàng sẽ được trả lại, nếu tôi không sử dụng SET ROWCOUNT
để hạn chế các hàng được trả về.
Tôi có thể xác minh điều này bằng COUNT()
mệnh đề.
SELECT COUNT(*) FROM Cats;
Kết quả:
+--------------------+ | (No column name) | |--------------------| | 3 | +--------------------+
Đặt lại ROWCOUNT
Bạn có thể đặt lại ROWCOUNT
giá trị bằng cách đặt cho nó giá trị 0
(không).
Điều này có nghĩa là các truy vấn sẽ không bị giới hạn kết quả nữa. Truy vấn sẽ tiếp tục xử lý đến hết.
SET ROWCOUNT 0;
SELECT * FROM Cats;
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected)
ROWCOUNT so với TOP ()
Nếu bạn sử dụng TOP()
mệnh đề trong truy vấn khi bạn đã đặt ROWCOUNT
của mình , ROWCOUNT
của bạn cài đặt sẽ chỉ ghi đè TOP()
if ROWCOUNT
là giá trị nhỏ hơn.
Đây là một ví dụ trong đó ROWCOUNT
là giá trị lớn hơn.
SET ROWCOUNT 3;
SELECT TOP(2) * FROM Dogs;
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | +---------+-----------+ (2 rows affected)
Trong trường hợp này, TOP()
điều khoản đã thắng.
Và đây là một ví dụ trong đó ROWCOUNT
là giá trị nhỏ hơn.
SET ROWCOUNT 1;
SELECT TOP(2) * FROM Dogs;
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | +---------+-----------+ (1 row affected)
Khả năng tương thích
Lưu ý rằng Microsoft khuyên rằng SET ROWCOUNT
sẽ không ảnh hưởng đến DELETE
, INSERT
và UPDATE
các câu lệnh trong bản phát hành SQL Server trong tương lai. Microsoft khuyên bạn nên tránh sử dụng như vậy trong công việc phát triển mới và có kế hoạch sửa đổi các ứng dụng hiện đang sử dụng nó.
Microsoft khuyến nghị sử dụng TOP()
nếu bạn cần giới hạn các hàng bị ảnh hưởng trong DELETE
, INSERT
và UPDATE
tuyên bố.
Thận trọng
ROWCOUNT
tùy chọn hoạt động trên hầu hết các câu lệnh T-SQL, bao gồm cả các trình kích hoạt. Tuy nhiên, nó không ảnh hưởng đến các con trỏ động, nhưng nó hạn chế số hàng của bộ bàn phím và con trỏ không nhạy cảm. Do đó, tùy chọn này nên được sử dụng một cách thận trọng.