2009-12-08 10 views
5

Si me uno a la tabla A a la tabla B como este ...¿SQL Server incluso mira una tabla cuando se une a una variable que devuelve falso?

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

y @param no es igual a 'someValue', SQL Server no intenta siquiera coincide con los registros de la tabla B, o es lo suficientemente inteligente como para saber la condición nunca será verdad?

+0

¿Por qué harías esto alguna vez? ¿O es solo un hipotético? –

+0

Estaba tratando de encontrar una forma eficiente de escribir una consulta cuyos criterios pudieran existir en 1 de 15 tablas diferentes según un parámetro que indicara qué tabla. – adam0101

+0

Parece que ese es su problema de raíz y esto es solo un síntoma de eso. ¿Qué tipo de consulta abarca 15 entidades diferentes? –

Respuesta

7

Así, mientras que en un contexto particular, es posible que el @param cuando tiene un valor diferente al del la tabla de unión externa nunca debe ser sondeada, no debe confiar en que sea correcta. Tenga en cuenta que la sonda significa que los valores reales se buscan en la tabla. La información de metadatos será siempre se comprobará. Por ejemplo, no puedes hacer trampa y pedir unirte a una mesa que no existe.

En particular, no intente crear una sola consulta donde debería haber dos diferentes (una que se une, otra que no).

+0

¡Respuesta impresionante! – cdonner

1

Es más fácil poner este código en una nueva respuesta en lugar de un comentario, pero esto muestra un poco de lo que Remus está diciendo:

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 

Si lo hace un plan de ejecución en las dos declaraciones Exec, Verá que sys.columns aparece en ambos planes de ejecución, pero en el segundo las filas se filtran antes de que la unión tenga lugar. Sin embargo, tenga en cuenta que no están en cortocircuito fuera de la consulta.

Cuestiones relacionadas