Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách SET ROWCOUNT hoạt động trong SQL Server

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 , INSERTUPDATE 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 , INSERTUPDATE 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi số nguyên thành số thập phân trong SQL Server

  2. Các truy vấn ANSI JOIN và không phải ANSI JOIN có thực hiện khác nhau không?

  3. Tìm hiểu xem một đối tượng có phải là khóa ngoại với OBJECTPROPERTY () trong SQL Server hay không

  4. Cách DENSE_RANK () hoạt động trong SQL Server

  5. Sử dụng DateTime trong SqlParameter cho thủ tục được lưu trữ, lỗi định dạng