Eu tenho uma visão parecida com esta:
CREATE VIEW Shipment.Shipment AS
SELECT CASE
WHEN shipmentOld.SHIPMENT_ID = 0 OR shipmentOld.SHIPMENT_ID = -1 THEN NULL
ELSE shipmentOld.SHIPMENT_ID
END AS ShipmentId,
OtherValue, SomeOtherValue, OtherStuff
FROM dbo.tblShipment_Old shipmentOld
GO
Então, se eu fizer uma consulta assim:
SELECT * FROM Shipment.Shipment WHERE ShipmentId = 18140
Eu recebo uma varredura completa do índice. O motivo é que ele está executando a expressão case para ShipmentId em todas as linhas da tabela e comparando o resultado com meu ShipmentId (18140). A própria definição de não-sargável.
Estou usando essa visão para normalizar dados legados para que eu possa escrever um novo aplicativo sobre eles. Eu só quero que a expressão case seja executada na saída.
Acho que isso não é possível, mas pensei em perguntar antes de buscar opções mais extremas. Então aqui está a minha pergunta:
É possível ainda fazer com que minha saída ShipmentId passe pela expressão case, mas também tenha uma consulta sargável quando ShipmentId for usado na cláusula where ?
Não. O SQL Server não faz isso por você.
É aqui que você pode usar uma Função com Valor de Tabela embutida, às vezes chamada de "exibição parametrizada". POR EXEMPLO
Ou adicione uma coluna extra à sua visualização.
Se esta é apenas uma questão de desempenho, você pode considerar escrever sua visão assim:
Isso permite buscas de índice ao filtrar um valor que não seja 0 ou -1:
Se o que você realmente queria era ter uma única coluna em uma visão que se comportasse de maneira diferente quando usada na
WHERE
cláusula e quando usada naSELECT
cláusula, então não, isso não é possível.