Вы могли бы хотеть взглянуть на Лассо Процесса .
Таким образом, хотя в конкретном контексте вы можете обнаружить, что когда @param имеет другое значение, внешняя таблица соединения может никогда не быть исследована , вам не следует положитесь на его правильность. Обратите внимание, что зонд означает, что фактические значения ищутся в таблице. Информация метаданных будет всегда проверяться. Например, вы не можете обмануть и запросить соединение с таблицей, которой не существует.
В частности, не пытайтесь создать один запрос, в котором должно быть два разных запроса (один соединяется, другой нет. ).
Проще поместить этот код в новый ответ, чем в комментарий, но это показывает то, что говорит Ремус:
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 появляется в обоих планах выполнения, но во втором плане все строки фильтруются до того, как произойдет соединение. Обратите внимание, что они не исключаются полностью из запроса.