2010-08-09 16 views
5

Tôi đã sử dụng thủ tục được lưu sẵn được xây dựng trong sp_MSforeachtable để xác định số hàng của từng bảng trong cơ sở dữ liệu của chúng tôi, sử dụng COUNT (*).Truy vấn rẻ nhất tôi có thể chạy để xem liệu có bất kỳ hàng nào trong bảng không?

Tôi đã nhận ra, tuy nhiên, tôi chỉ muốn 0 hoặc 1, tùy thuộc vào việc có bất kỳ hàng nào trong bảng hay không.

Có điều gì khác mà tôi có thể sử dụng nhanh hơn/rẻ hơn COUNT (*) không?

+0

Hãy nhìn vào http://stackoverflow.com/questions/1597442/subquery-using-exists-1-or-exists – StuartLC

+1

Bất kỳ câu trả lời nào bạn đưa ra đều phải được đánh giá chuẩn. COUNT (*) có thể được tối ưu hóa tốt tùy thuộc vào DBMS, ngoài ra nó rõ ràng thể hiện ý định của những gì bạn đang cố gắng làm. –

Trả lời

8

Xem xét truy vấn này. EXISTS sẽ ngừng thực thi khi tìm thấy kết quả trùng khớp đầu tiên.

IF EXISTS (SELECT 1 FROM MyTable) 
BEGIN 
    print 'at least one!' 
END 
ELSE 
BEGIN 
    print 'no rows found in table' 
END 
+0

@Downvoter: giải thích lý do tại sao điều này không giải quyết được vấn đề và/hoặc giúp OP? –

0

Có thể chỉ cần lấy hàng đầu tiên và hiển thị 1?

select top 1 1 from tablename

+4

Không chắc chắn lý do tại sao điều này đã được upvoted cho TSQL? –

+0

@ p.campbell: bạn chỉ có thể yêu cầu chỉnh sửa, thay vì chi tiêu cho đại diện của riêng bạn về việc giảm giá. :) Chỉnh sửa đúng không? –

+0

@ p.campbell; đã cho bạn một upvote anyways, hy vọng rằng làm cho nó. –

0
SELECT TOP 1 ID FROM TABLE 

Sau đó, bạn có thể làm một kiểm tra EOF khi recordset được trả về.

0

sp_spaceused có thể sẽ hiệu quả hơn COUNT(*).

Hãy nhớ rằng nó không cập nhật theo thời gian thực để nó có thể không chính xác 100% trong mọi trường hợp.

3

này sẽ in tất cả các tên bảng có ít nhất 1 hàng

exec sp_MSforeachtable 'if exists (select 1 from ?) print ''?''' 
Các vấn đề liên quan