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

Assume the following schema and query: Please look past the glaring design issues with having values in a varchar column that we expect to be ints.
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
The break:

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

For example, this returns zero results
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.

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

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

Теперь он фильтрует сначала в предложении where родительской таблицы.

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

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

Спасибо

Edit - Answer:

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

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

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

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

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