2010-09-22 32 views
9

Tôi đang tạo truy vấn có nhiều tham số tùy chọn, một số trong số đó là Tham số có giá trị theo bảng. Vấn đề mà tôi đang phải đối mặt là làm thế nào để sử dụng hiệu quả nhất các TVP trong truy vấn này?Điều kiện Trường hợp câu lệnh trên bảng có giá trị tham số?

Mỗi TVP có các loại:

TABLE([variable] nvarchar(30)) 

Tôi biết rằng tôi có thể thường:

INNER JOIN @TVP 

để lọc ra bất cứ điều gì mà không có trong danh sách TVP, nhưng những gì nếu Tôi quyết định không chuyển bất kỳ giá trị nào cho TVP trong truy vấn của mình? Sau đó, không có gì sẽ được trả lại (vì liên kết nội)

Thông thường này được thực hiện với một điều kiện mà tuyên bố:

WHERE (SomeVar = @SameVar OR @SameVar IS NULL) 

Nhưng, với một TVP, nó không thể là null (ít nhất không phải là tôi đã tìm thấy)

Một cách tôi đã tìm thấy để thực hiện điều này là:

OUTER APPLY 
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in 
(select * from @TVP) or not exists (select * from @TVP) 
AND tbl.SomeVar = SomeVar) 

Đáng tiếc là phương pháp này là horridly chậm

Ngoài ra, tôi đã cố gắng:

WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP)) 

Đây là MUCH nhanh, nhưng tôi vẫn cảm thấy như nó có thể không lý tưởng

Bất kỳ giúp đỡ hoặc tư tưởng sẽ được đánh giá cao! Hãy cho tôi biết nếu tôi có thể làm sáng tỏ bất cứ điều gì .... Cảm ơn trước

EDIT:

Vì vậy, tôi đã đi lên với điều này, và có lẽ sẽ sử dụng nó trừ khi ai đó có một giải pháp tốt hơn:

INNER JOIN @TVP tvp 
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null) 

Trả lời

12

các bạn đã thử:

DECLARE @UseTVP int 
    SET @UseTVP = (SELECT COUNT(*) FROM @TVP) 

    SELECT TOP 1 * 
     FROM dbo.SomeTable tbl 
      LEFT JOIN @TVP tvp 
       ON tbl.SomeVar = tvp.SomeVar 
     WHERE (tvp.SomeVar IS NOT NULL 
       OR @UseTVP = 0) 
+0

Vì vậy, những gì nếu tôi không sử dụng TVP trong một truy vấn? Sau đó, nó sẽ luôn luôn là null, và tôi sẽ không nhận được kết quả, phải không? Làm cách nào để sử dụng TVP tùy chọn? – Brett

+0

@Brett: Tôi thấy điểm của bạn ngay bây giờ. Trở lại với bản vẽ. –

+0

@Brett: Tôi đã chỉnh sửa câu trả lời của mình. Không chắc chắn nếu điều này là tốt hơn so với những gì bạn đã thử. –

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