Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

IsNumeric no SQL Server JOIN


Você não pode contar com a ordem em que um banco de dados avaliará as expressões de filtragem. Existe um otimizador de consulta que avaliará seu SQL e criará um plano para executar a consulta com base no que ele percebe que produzirá o melhor desempenho .

Neste contexto, IsNumeric() não pode ser usado com um índice e significa executar uma função em cada linha da tabela. Portanto, quase nunca fornecer o melhor desempenho percebido. Compare isso com o SrcID > 15 expressão, que pode ser correspondida com um índice (se houver), e é apenas uma única expressão de operador, mesmo que não exista. Ele também pode ser usado para filtrar o número de linhas potenciais onde o IsNumeric() função precisa ser executada.

Você provavelmente pode contornar isso com uma exibição, uma subconsulta, um CTE, uma instrução CASE ou uma coluna computada. Veja um exemplo de CTE:
With NumericOnly As 
(
    SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15

E aqui está uma opção de instrução CASE:
SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15