Solución:
La razón por la que no hay una advertencia de “conversión de tipo / estimación de cardinalidad” en esta consulta:
SELECT LEFT(30500600, 2);
…es porque no hay estimación de cardinalidad. Es una expresión constante que se pasa a una función determinista, garantizada para devolver solo una “fila”. Creo que la explicación es tan simple como eso, ya que la advertencia es más sobre los posibles problemas de cardinalidad (en lugar de solo la simple existencia de la conversión de tipos).
Si obtengo el plan de ejecución estimado para esa declaración, es solo un elemento “seleccionar sin consulta”:
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.518" Build="13.0.5081.1" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementCompId="1" StatementId="1" StatementText="select LEFT(30500600, 2)" StatementType="SELECT WITHOUT QUERY" RetrievedFromCache="false" />
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>
Por lo que vale, incluso la versión de la variable de la tabla no muestra la advertencia en SQL Server 2017 (porque es realmente una advertencia inútil cuando la conversión no puede afectar una estimación de cardinalidad, como en su ejemplo).
Para ser claros, esa advertencia no es siempre inútil. Toma este ejemplo:
SELECT message_id
INTO #SomeNumbers
from sys.messages;
SELECT *
FROM #SomeNumbers
WHERE LEFT(message_id, 2) = '50';
Esto coloca 280192 filas en una tabla temporal. La consulta SELECT tiene esta advertencia y la advertencia es legítima. SQL Server estima que hay 28.019,2 filas coincidentes (10% de la tabla), cuando en realidad solo hay 2.156 filas coincidentes (<1% de la tabla).
Con respecto a su ejemplo en el que lanza esta entrada en el LEFT
función, observe que la advertencia ha cambiado ligeramente de CONVERT_IMPLICIT
para sólo CONVERT
:
Escriba la conversión en la expresión (CONVERT (varchar (12),[test].[col1], 0)) puede afectar a “CardinalityEstimate” en la elección del plan de consulta
Por lo tanto, solo está reemplazando una conversión implícita por una explícita, lo que aún justifica una advertencia.