Tengo un procedimiento almacenado que tiene un parámetro opcional, @UserID VARCHAR(50)
. La cuestión es que hay dos maneras de trabajar con él:SQL En cuanto a rendimiento, lo que es mejor: ¿una cláusula IF ... ELSE o una cláusula WHERE LIKE?
- darle un valor por defecto de
NULL
, el tener una cláusulaIF...ELSE
, que realiza dosSELECT
consultas diferentes, uno con'WHERE UserID = @UserID'
y sin el dónde. - Déle un valor predeterminado de
'%'
y luego simplemente use la cláusula where use'WHERE UserID LIKE @UserID'
. En el código de llamada, no se usará '%', por lo que solo se encontrarán las coincidencias exactas.
La pregunta es: ¿Qué opción es más rápida? ¿Qué opción proporciona un mejor rendimiento a medida que crece la tabla? Tenga en cuenta que la columna UserID
es una clave externa y no está indexada.
EDIT: Algo que quiero añadir, basado en algunas respuestas: El parámetro @UserID
no es (necesariamente) que se pasa el único parámetro opcional . En algunos casos, hay hasta 4 o 5 parámetros opcionales.
Te lo ruego ... no vayas con la respuesta que aceptaste. Es un camino seductor que conduce al dolor y la miseria. –
Mark, leí su respuesta y me ha convencido. Lo único ahora, como se menciona en otro comentario: ¿Cómo manejas múltiples parámetros opcionales? La forma en que se hace ahora en nuestro DB es concatenar una cadena WHERE, agregar eso a la cadena SQL y llamar a EXEC() sobre eso. hay una manera mas facil? – Schmuli
Otra opción es escribir código que escribe código. Si necesita 5 PLANES distintos, escriba un programa que genere esos 5 SQL y las declaraciones de casos que determinan qué sql hace qué grupo de variables. Pero no ejecute su metacódigo, tome la salida y verifique eso en CVS. el metacódigo es para su uso. –