where isnull(name,'') <> ''
es equivalente a
where name is not null and name <> ''
que a su vez es equivalente a
where name <> ''
(si el nombre IS NULL
que expresión final evaluaría a lo desconocido y no se devuelve la fila)
El uso del patrón ISNULL
dará como resultado un escaneo y es menos effi ciente como se puede ver en la prueba siguiente.
SELECT ca.[name],
[number],
[type],
[low],
[high],
[status]
INTO TestTable
FROM [master].[dbo].[spt_values]
CROSS APPLY (SELECT [name]
UNION ALL
SELECT ''
UNION ALL
SELECT NULL) ca
CREATE NONCLUSTERED INDEX IX_TestTable ON dbo.TestTable(name)
GO
SELECT name FROM TestTable WHERE isnull(name,'') <> ''
SELECT name FROM TestTable WHERE name is not null and name <> ''
/*Can be simplified to just WHERE name <> '' */
Que debería darle el plan de ejecución que necesita.
Martin Smith tiene razón si está citando el código con precisión. Si en realidad es algo así como isnull (name, '') <> @name, entonces evitará que SQL use ningún índice, pero obtendrá un resultado más parecido al que describe Donnie – Matt
@Matt: Sí, cometí un error en el código que di en el ejemplo. Ahora está arreglado. – tgandrews