Приведение MSSQL ([varcharColumn] к int) в SELECT выполняется до того, как предложение WHERE отфильтровывает неверные значения
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 resultsselect 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, потому что они предпочитают иметь больший контроль над тем, чтобы мы сначала получили меньший набор результатов (ответ Аарона), однако все сводится к рассмотрению плана запроса и проверке Ваше чтение имеет значение.
Еще раз спасибо за все ответы!