sql >> Base de Datos >  >> RDS >> Sqlserver

Use SQL para filtrar los resultados de un procedimiento almacenado

No hay buenas maneras de hacer eso. Es una limitación de los procedimientos almacenados. Sus opciones son:

  1. Cambie el procedimiento a una Función definida por el usuario . Hoy en día, en todo el mundo, la gente está creando procedimientos almacenados que deberían ser funciones. Es un tema de educación. Tu situación es un buen ejemplo de por qué. Si su procedimiento fuera en cambio un UDF, podría simplemente hacer lo siguiente, exactamente como cree intuitivamente que debería ser capaz de hacerlo:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Si realmente no puede tocar su procedimiento y debe haz esto en sql, entonces tendrás que ponerte funky. Cree otro procedimiento almacenado para envolver su procedimiento original. Dentro de su nuevo procedimiento, llame a su procedimiento existente y coloque los valores en una tabla temporal, luego ejecute una consulta en esa tabla con el filtro que desea y devuelva ese resultado al mundo exterior.

A partir de SQL Server 2005, las funciones definidas por el usuario son la forma de encapsular la recuperación de datos. Los procedimientos almacenados, junto con las vistas, son herramientas especializadas para usar en situaciones particulares. Ambos son muy útiles en el momento adecuado, pero no son la primera opción. Algunos podrían pensar que el ejemplo anterior (A) obtiene todos los resultados de la función y luego (B) filtra en ese conjunto de resultados, como una subconsulta. Este no es el caso . SQL Server 2005+ optimiza esa consulta; si hay un índice en login , no ve un recorrido de tabla en el plan de ejecución de consultas; muy eficiente.

Editar :Debo agregar que las entrañas de un UDF son similares a las de un SP. Si está jugando con la lógica del SP que desea evitar, aún puede cambiarlo a una función. Varias veces he tomado un código de procedimientos grande y aterrador que no quería tener que entender, y lo transfirí con éxito a una función. El único problema será si el procedimiento modifica cualquier cosa además de devolver resultados; Las UDF no pueden modificar datos en la base de datos.