Приведение MSSQL ([varcharColumn] к int) в SELECT выполняется до того, как предложение WHERE отфильтровывает неверные значения

Предположим следующую схему и запрос:Пожалуйста, обратите внимание на вопиющие проблемы проектирования, связанные с наличием значений в столбце varchar, которые, как мы ожидаем, будут целочисленными.
create table dbo.Parent (
    Id bigint NOT NULL,
    TypeId int NOT NULL
)

create table dbo.Child (
    Id bigint NOT NULL,
    ParentId bigint NOT NULL,
    TypeId int NOT NULL,
    varcharColumn varchar(300) NULL
)

select cast(c.varcharColumn as int)
from dbo.Parent p (nolock)
    inner join dbo.Child c (nolock)
        on p.Id = c.ParentId
            and c.TypeId = 2
where p.TypeId = 13
Перерыв:

Мы получаем разрыв приведения из-за значения, которое не может быть преобразовано в int. В этом случае: "123-1", Странно то, что приведенное значение отфильтровывается из окончательного набора результатов.

Например, это возвращает ноль результатов
select c.varcharColumn
from dbo.Parent p (nolock)
    inner join dbo.Child c (nolock)
        on p.Id = c.ParentId
            and c.TypeId = 2
where p.TypeId = 13
    and c.varcharColumn = '123-1'

План запроса заканчивается просмотром таблицы Child и применением функции cast перед предложением where.

Мы смогли это исправить, создав новый индекс для дочерней таблицы (он делал PKсканирование)

create index [NCIDX_dbo_Child__TypeId] on dbo.Child (
    TypeId
)
include (
    ParentId,
    varcharColumn
)

Теперь он фильтрует на родительской таблицеs где пункт первым.

Есть ли способ исправить это без дополнительного индекса? И еще раз, пожалуйста, воздержитесь от любых предложений, связанных с исправлением нашей схемы. Это определенно правильное решение в этом случае.

Меня больше всего интересует понимание того, почему он применил приведение, прежде чем отфильтровать набор результатов.

Спасибо

Изменить - Ответ:

Большое спасибо и Аарону, и Гордону. Если я когда-либо получу больше 15 очков, яЯ вернусь и вернем оба ваших ответа.

В итоге нам понадобился Гордонответ, так как мы хотели использовать этот запрос в представлении. Несколько человек в офисе опасались использовать заявление случая, потому что они предпочитают иметь больший контроль над тем, чтобы у нас сначала был меньший набор результатов (Аарон 's ответ), однако все сводится к просмотру плана запроса и проверке количества прочитанных.

Еще раз спасибо за все ответы!

Ответы на вопрос(3)

Ваш ответ на вопрос