2010-03-08 24 views
11

Tôi đang gặp một số rắc rối với tuyên bố này, do không có nghi ngờ sự thiếu hiểu biết của tôi về những gì được trả về từ câu lệnh select này:Tiết kiệm một giá trị select count (*) để một số nguyên (SQL Server)

declare @myInt as INT 
set @myInt = (select COUNT(*) from myTable as count) 

if(@myInt <> 0) 
begin 
    print 'there's something in the table' 
end 

Có các bản ghi trong myTable, nhưng khi tôi chạy mã trên báo cáo in thì không bao giờ chạy. Kiểm tra thêm cho thấy rằng myInt là trên thực tế số không sau khi chuyển nhượng ở trên. Tôi chắc chắn rằng tôi đang thiếu một cái gì đó, nhưng tôi giả định rằng một số lựa chọn sẽ trả về một vô hướng mà tôi có thể sử dụng ở trên?

+0

Mã này chạy tốt cho một số máy chủ tôi có quyền truy cập - bạn có thể giải thích rõ về tình huống gây ra hành vi này không? Có một "SELECT COUNT (*) FROM Table" thường xuyên trả về những gì bạn mong đợi không? – SqlRyan

Trả lời

32

Nếu @myInt bằng không, nó có nghĩa là không có hàng trong bảng: nó sẽ là NULL nếu không bao giờ được đặt ở tất cả.

COUNT sẽ luôn trả về một hàng, ngay cả khi không có hàng trong bảng.

Chỉnh sửa, tháng 4 năm 2012: các quy tắc cho việc này được mô tả trong câu trả lời của tôi ở đây: Does COUNT(*) always return a result?

đếm của bạn/assign là đúng nhưng có thể là một trong hai cách:

select @myInt = COUNT(*) from myTable 
set @myInt = (select COUNT(*) from myTable) 

Tuy nhiên, nếu bạn là chỉ tìm kiếm sự tồn tại của hàng, (KHÔNG) EXISTS là hiệu quả hơn:

IF NOT EXISTS (SELECT * FROM myTable) 
9
select @myInt = COUNT(*) from myTable 
+0

Đây không phải là câu trả lời, chỉ là một cấu trúc bài tập thay thế. Nó vẫn sẽ cung cấp "số không" – gbn

4
Declare @MyInt int 
Set @MyInt = (Select Count(*) From MyTable) 

If @MyInt > 0 
Begin 
    Print 'There''s something in the table' 
End 

Tôi không chắc liệu đây có phải là vấn đề của bạn hay không, nhưng bạn phải đưa ra một câu trích dẫn duy nhất trong bản in với câu trích dẫn thứ hai. Trong khi bạn có thể sử dụng SELECT để cư trú biến, sử dụng SET như bạn đã làm ở đây chỉ là IMO tốt và rõ ràng hơn. Ngoài ra, bạn có thể được đảm bảo rằng Count (*) sẽ không bao giờ trả về một giá trị âm vì vậy bạn chỉ cần kiểm tra xem nó có lớn hơn không.

+0

Tôi đã thay đổi câu lệnh in sao cho nó có ý nghĩa trong bài đăng của tôi (nó có thông điệp dành riêng cho doanh nghiệp) và quên thoát khỏi báo giá. Cảm ơn sự giúp đỡ của bạn về lựa chọn được chọn/đặt! – larryq

0

[cập nhật] - Vâng, sự ngu ngốc của riêng tôi cung cấp câu trả lời cho câu hỏi này. Khi nó quay ra, tôi đã xóa các bản ghi từ myTable trước khi chạy câu lệnh COUNT chọn.

Tôi làm như thế nào và không được thông báo? Vui mừng bạn hỏi. Tôi đã thử nghiệm một nền tảng thử nghiệm đơn vị sql (tsqlunit, if you're interested) và là một phần của một trong các thử nghiệm mà tôi đã chạy một bảng lệnh cắt ngắn, sau đó ở trên. Sau khi kiểm tra đơn vị là trên tất cả mọi thứ được cuộn lại, và hồ sơ được trở lại trong myTable. Đó là lý do tại sao tôi có số lượng hồ sơ bên ngoài các bài kiểm tra của mình.

Xin lỗi mọi người ... cảm ơn sự giúp đỡ của bạn.

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