2012-01-05 17 views
8

Đây là một phần của một trong những thủ tục lưu trữ của tôi:Cách kiểm tra xem biến bảng có trống trong SQL Server không?

@dataInTable dbo.Table_Variable readonly, 
.... 

AND (
    (@dataInTable IS NULL) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

@dataInTable IS NULL là sai trong cú pháp, lỗi là

Must declare the scalar variable "@dataInTable"

Vì vậy, tôi thay đổi nó thành:

(SELECT T FROM @dataInTable) IS NULL 

tác phẩm này nhưng nếu @dataInTable có nhiều hơn 1 mục, tôi gặp lỗi:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

thể hiểu được, vì vậy tôi thay đổi nó thành:

(SELECT TOP(1) T FROM @ProgramRatings) IS NULL 

trình một cách hoàn hảo, những gì tôi có là hiệu suất đáng quan tâm.

tôi tự hỏi, nếu có có một cách dễ dàng hơn để kiểm tra xem một biến bảng là trống rỗng, như

AND (
    (@dataInTable IS EMPTY) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

Trả lời

5

Đối với séc nếu biến bảng là trống rỗng, chỉ cần sử dụng EXISTS như đã đề cập bởi những người khác,

nhưng

nếu bạn khác tập rỗng từ chưa biết thiết lập - sau đó bạn không có sự lựa chọn - bạn phải giới thiệu thêm biến mà tiểu bang nếu tập rỗng thực sự có sản phẩm nào hoặc không rõ.

declare @dataInTableIsUnknown BIT 

... 

AND (
    (@dataInTableIsUnknown = 1) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 
21

Bảng biến là khác nhau từ các biến vô hướng để @dataInTable IS NULL không được phép như bạn đề cập. Tôi xin đề nghị như sau:

EXISTS (SELECT 1 FROM @dataInTable) 

Sau đây cũng có thể có ý nghĩa cho tình hình của bạn nếu bạn thực sự quan tâm để biết đếm:

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable) 
IF @dataCount = 0 -- Empty 
11

Luôn luôn exists.

Ví dụ:

select 'Yep' 
where exists (select 1 from @dataInTable) 
+4

+1 'EXISTS' có thể hiệu quả hơn' COUNT' khi nó dừng sau hàng đầu tiên. –

+0

Cảm ơn, tôi đã thử tồn tại nhưng không thể sử dụng trong điều kiện được chọn: VÀ ( (Tôi KHÔNG THỂ NƠI NƠI TẠI ĐÂY) HOẶC (mục IN (SELECT T FROM @dataInTable)) ). Bạn có biết cú pháp chính xác –

+1

@EricYin Có thể bạn đang tìm kiếm 'CASE' nếu bạn muốn sử dụng nó trong một' SELECT'. Khó khăn để biết những gì bạn đang làm dựa trên những mảnh bạn đã đăng cho đến nay. –