2011-09-07 25 views
41

Si tenemos una declaración SELECT dentro de un IF EXISTS, ¿la ejecución se detiene tan pronto como encuentra un registro en la tabla? Por ejemplo:SI EXISTE en T-SQL

IF EXISTS(SELECT * FROM table1 WHERE Name='John') 

return 1 

else 

return 0 

Si existe una fila en la tabla con el nombre = John, ¿se detiene la ejecución y devuelve 1 o se atraviesa a través de toda la tabla en busca de más partidos?

+0

FYI, también se podría considerar el uso de SELECT 1 en lugar de SELECT * para que pueda aprovechar mejor los índices (no recuperar todos los campos de la mesa). – sfuqua

+14

@sfuqua [Este es un mito] (http://bradsruminations.blogspot.com/2009/09/age-old-select-vs-select-1-debate.html) –

+2

IF EXISTS (SELECCIONE 1/0 FROM table1 DONDE Name = 'John') ... esto no será un error ... SQL nunca evalúa el 'SELECT' ... solo está mirando el' WHERE'. –

Respuesta

47

Sí, detiene la ejecución por lo que siempre se prefiere a COUNT > 0 que a menudo no lo hará.

Si mira el plan de ejecución, verá que el número real de filas que salen de table1 no será más de 1, independientemente del número de registros coincidentes.

See this article for some discussion on EXISTS vs COUNT

Si se combinan EXISTS() AND EXISTS() consultas sin embargo cannot rely on short circuiting. es decir, si la primera consulta es falsa y, por lo tanto, toda la expresión es falsa, la segunda consulta se ejecutará.

+1

¿Hay una mejor manera de hacer lo siguiente: IF EXISTS (SELECT * FROM t1 donde xxx e yyy) RETURN 2 ELSE COMENZAR SI EXISTE (SELECT * FROM t1 donde xxx) RETURN 1 ELSE RETURN 0 FIN Tengo esto dentro de un proceso almacenado y el proceso almacenado se ejecuta muy a menudo. Mi principal motivación es mejorar el rendimiento. Sé que puedo usar una constante 1 o 0 en lugar de * en SELECCIONAR pero la mejora de rendimiento correspondiente es insignificante – Sidd

+0

@Sidd - Posiblemente depende de cuál es la consulta exacta y qué índices tiene. En su lugar, podría hacer 'SELECT TOP 1 * FROM t1 WHERE xxx ORDER BY some_condition_that_would_mean_yyyy_would_be_first' y luego inspeccionar el resultado. –

-3

No hay necesidad de "más" en este caso:

IF EXISTS(SELECT * FROM table1 WHERE Name='John') return 1 
return 0 
+0

Una instrucción RETURN con un valor de retorno no se puede usar en este contexto. – Aditya