2009-12-08 62 views
5

如果我加入一個表像這樣B表...當連接到返回false的變量時,SQL Server甚至會查看錶嗎?

select A.* from A 
left outer join B on A.Id = B.aId and @param = 'someValue' 

和@參數不等於「someValue中」,並SQL服務器甚至嘗試匹配從表B中的記錄還是足夠聰明,知道這種情況永遠不會是真的?

+0

爲什麼你會永遠這樣做呢?或者它只是一個假設? – 2009-12-08 03:05:56

+0

我試圖找到編寫一個查詢,其標準可能存在的15種不同的表取決於其指示表中的參數的有效方式。 – adam0101 2009-12-08 14:33:54

+0

聽起來像這是你的根源問題,這只是一個症狀。什麼樣的查詢跨越15個不同的實體? – 2009-12-08 14:38:21

回答

7

因此,儘管在特定的環境下,你可能會發現,當@參數具有不同的值,則外連接表可能永遠探測,你不應該依賴於它的正確性。請注意,探針意味着在表格中搜索實際值。元數據信息將總是進行檢查。例如,你不能作弊並要求加入一個不存在的表。

尤其是,不要試圖創建一個查詢裏應該有兩個不同的人(一個連接,一個沒有)。

+0

令人印象深刻的答案! – cdonner 2009-12-08 01:18:09

1

它更容易把這個代碼放在一個新的答案,而不是評論,但是這顯示了一點什麼萊姆斯是說:

CREATE PROCEDURE dbo.Test_Params 
    @param1 INT 
WITH RECOMPILE 
AS 
BEGIN 
    SELECT 
     o.object_id, 
     c.object_id 
    FROM 
     sys.objects o 
    LEFT OUTER JOIN sys.columns c ON 
     c.object_id = o.object_id AND 
     @param1 = 1 
    OPTION 
     (RECOMPILE) 
END 
GO 


EXEC dbo.Test_Params 1 
EXEC dbo.Test_Params 2 

如果你對兩個EXEC語句的執行計劃,你會看到sys.columns出現在兩個執行計劃中,但第二個行在連接發生之前都被過濾了。請注意,儘管如此,它們並未從查詢中完全短路。

相關問題