He estado aprendiendo Funciones y Procedimiento almacenado durante bastante tiempo, pero no sé por qué y cuándo debo usar una función o un procedimiento almacenado. Me parecen iguales, tal vez porque soy un poco novato al respecto.
¿Alguien puede decirme por qué?
Respuestas:
Las funciones son valores calculados y no pueden realizar cambios ambientales permanentes en
SQL Server
(es decir, no se permitenINSERT
oUPDATE
declaraciones).Una función se puede usar en línea en las
SQL
declaraciones si devuelve un valor escalar o se puede unir si devuelve un conjunto de resultados.Un punto digno de mención de los comentarios, que resumen la respuesta. Gracias a @Sean K Anderson:
Cómo llamar a la
SQL
función desde el procedimiento de almacenamiento y cuando usamos una función en lugar del procedimiento almacenado.Hola amigos, hoy discutiremos cuándo usar el procedimiento almacenado y cuándo usar la función. En equipo simple Si desea calcular algunos valores y devolverá un solo valor, por lo que no es obligatorio:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
fuente
La diferencia entre SP y UDF se enumera a continuación:
fuente
Las funciones y los procedimientos almacenados tienen propósitos separados. Aunque no es la mejor analogía, las funciones se pueden ver literalmente como cualquier otra función que usaría en cualquier lenguaje de programación, pero los procesos almacenados son más como programas individuales o un script por lotes.
Las funciones normalmente tienen una salida y opcionalmente entradas. La salida se puede usar como entrada para otra función (un servidor SQL incorporado como DATEDIFF, LEN, etc.) o como un predicado para una consulta SQL, por ejemplo,
SELECT a, b, dbo.MyFunction(c) FROM table
oSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.Los procesos almacenados se utilizan para vincular consultas SQL en una transacción e interactuar con el mundo exterior. Los marcos como ADO.NET, etc. no pueden llamar a una función directamente, pero pueden llamar a un proceso almacenado directamente.
Sin embargo, las funciones tienen un peligro oculto: pueden ser mal utilizadas y causar problemas de rendimiento bastante desagradables: considere esta consulta:
Donde MyFunction se declara como:
Lo que sucede aquí es que se llama a la función MyFunction para cada fila de la tabla MyTable. Si MyTable tiene 1000 filas, entonces esas son otras 1000 consultas ad-hoc en la base de datos. Del mismo modo, si se llama a la función cuando se especifica en la especificación de la columna, se llamará a la función para cada fila devuelta por SELECT.
Por lo tanto, debe tener cuidado al escribir las funciones. Si selecciona SELECT desde una tabla en una función, debe preguntarse si se puede realizar mejor con JOIN en el proceso almacenado primario o en alguna otra construcción SQL (como CASE ... WHEN ... ELSE ... FINAL).
fuente
SELECT * from dbo.MyTableValuedFunction()
. Sprocs, por otro lado, se puede llamar directamente con ADO.NET estableciendoSqlCommand.CommandType
enCommandType.StoredProcedure
.Diferencias entre procedimientos almacenados y funciones definidas por el usuario:
RAISEERROR
O@@ERROR
no están permitidos en UDF.GETDATE()
no se puede usar en UDF.fuente
GETDATE()
se puede usar en una función. El pivote sobre no determinista no es bueno.Escriba una función definida por el usuario cuando desee calcular y devolver un valor para usar en otras instrucciones SQL; escribir un procedimiento almacenado cuando lo desee es agrupar un conjunto posiblemente complejo de sentencias SQL. ¡Estos son dos casos de uso bastante diferentes, después de todo!
fuente
fuente
Diferencia básica
La función debe devolver un valor, pero en el procedimiento almacenado es opcional (el procedimiento puede devolver cero o n valores).
Las funciones solo pueden tener parámetros de entrada, mientras que los procedimientos pueden tener parámetros de entrada / salida.
La función toma un parámetro de entrada, es obligatorio, pero el procedimiento almacenado puede llevar de o a n parámetros de entrada.
Las funciones se pueden llamar desde el procedimiento, mientras que los procedimientos no se pueden llamar desde la función.
Diferencia anticipada
El procedimiento permite la instrucción SELECT y DML (INSERT / UPDATE / DELETE), mientras que Function solo permite la instrucción SELECT.
Los procedimientos no pueden utilizarse en una instrucción SELECT, mientras que Function puede integrarse en una instrucción SELECT.
Los procedimientos almacenados no se pueden usar en las instrucciones SQL en ninguna parte de la sección WHERE / HAVING / SELECT, mientras que Function sí.
Las funciones que devuelven tablas se pueden tratar como otro conjunto de filas. Esto se puede usar en JOINs con otras tablas.
La función en línea se puede considerar como vistas que toman parámetros y se pueden usar en JOIN y otras operaciones de conjunto de filas.
La excepción se puede manejar mediante el bloque try-catch en un Procedimiento, mientras que el bloque try-catch no se puede usar en una Función.
Podemos ir a la Gestión de transacciones en Procedimiento, mientras que no podemos ir a Función.
fuente
fuente
Returns
palabra clave y debe ser un tipo Escalar o de Tabla) , pero los Procedimientos almacenados pueden devolver opcionalmente : a) 1Int
tipo de Código de resultado a través de laReturn
Declaración y / o b) 1+ Parámetros (incluido elCursor
tipo) a través de laOutput
palabra clave y / o c) 1+ Conjuntos de filas a través deSelect
declaraciones. se devuelve, se puede usar como el argumento "execute_statement" de una instrucción "Insertar en".Una función definida por el usuario es una herramienta importante disponible para un programador de servidor SQL. Puede usarlo en línea en una instrucción SQL como esta
donde
lookupValue
habrá un UDF. Este tipo de funcionalidad no es posible cuando se utiliza un procedimiento almacenado. Al mismo tiempo, no puede hacer ciertas cosas dentro de un UDF. Lo básico para recordar aquí es que los UDF:Un procedimiento almacenado puede hacer esas cosas.
Para mí, el uso en línea de un UDF es el uso más importante de un UDF.
fuente
Los procedimientos almacenados se utilizan como scripts . Ejecutan una serie de comandos para usted y puede programarlos para que se ejecuten en determinados momentos. Por lo general, ejecuta múltiples declaraciones DML como INSERT, UPDATE, DELETE, etc. o incluso SELECT.
Las funciones se usan como métodos. Le pasa algo y devuelve un resultado. Debe ser pequeño y rápido, lo hace sobre la marcha. Usualmente se usa en una declaración SELECT.
fuente
Procedimiento almacenado:
EXEC
oEXECUTE
declaración.OUT
parámetro.Función:
Solo se puede usar para seleccionar registros. Sin embargo, se puede llamar muy fácilmente desde SQL estándar, como:
o
Para operaciones simples de selección reutilizables, las funciones pueden simplificar el código. Solo tenga cuidado con el uso de
JOIN
cláusulas en sus funciones. Si su función tiene unaJOIN
cláusula y la llama desde otra instrucción select que devuelve múltiples resultados, esa función llamaráJOIN
esas tablas juntas para cada línea devuelta en el conjunto de resultados. Entonces, aunque pueden ser útiles para simplificar cierta lógica, también pueden ser un cuello de botella de rendimiento si no se usan correctamente.OUT
parámetro.fuente
Función definida por el usuario.
Procedimiento almacenado
fuente
Para decidir cuándo usar lo que podrían ayudar los siguientes puntos:
Los procedimientos almacenados no pueden devolver una variable de tabla donde una función puede hacer eso.
Puede usar procedimientos almacenados para alterar los parámetros del entorno del servidor donde, al usar funciones, no puede.
salud
fuente
¡Las funciones de SQL Server, como los cursores, están destinadas a ser su última arma! Tienen problemas de rendimiento y, por lo tanto, el uso de una función con valores de tabla debe evitarse tanto como sea posible. Hablar de rendimiento es hablar de una tabla con más de 1,000,000 de registros alojados en un servidor en un hardware de clase media; de lo contrario, no necesita preocuparse por el impacto en el rendimiento causado por las funciones.
para más información, consulte: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
fuente
Comience con funciones que devuelven un solo valor. Lo bueno es que puede poner código usado con frecuencia en una función y devolverlo como una columna en un conjunto de resultados.
Luego, puede usar una función para una lista parametrizada de ciudades. dbo.GetCitiesIn ("NY") Eso devuelve una tabla que se puede usar como una combinación.
Es una forma de organizar el código. Saber cuándo algo es reutilizable y cuándo es una pérdida de tiempo es algo que solo se obtiene a través de prueba, error y experiencia.
Además, las funciones son una buena idea en SQL Server. Son más rápidos y pueden ser bastante poderosos. En línea y selecciones directas. Cuidado de no abusar.
fuente
Aquí hay una razón práctica para preferir funciones sobre procedimientos almacenados. Si tiene un procedimiento almacenado que necesita los resultados de otro procedimiento almacenado, debe usar una instrucción insert-exec. Esto significa que debe crear una tabla temporal y usar una
exec
instrucción para insertar los resultados del procedimiento almacenado en la tabla temporal. Está desordenado. Un problema con esto es que insert-execs no se puede anidar .Si está atascado con procedimientos almacenados que llaman a otros procedimientos almacenados, puede encontrarse con esto. Si el procedimiento almacenado anidado simplemente devuelve un conjunto de datos, se puede reemplazar con una función con valores de tabla y ya no obtendrá este error.
( esta es otra razón por la que debemos mantener la lógica de negocios fuera de la base de datos )
fuente
fuente
Las funciones se pueden usar en una instrucción select donde los procedimientos no pueden.
El procedimiento almacenado toma parámetros de entrada y salida, pero Functions solo toma parámetros de entrada.
Las funciones no pueden devolver valores de tipo texto, ntext, imagen y marcas de tiempo donde los procedimientos sí pueden.
Las funciones se pueden usar como tipos de datos definidos por el usuario en la tabla de creación, pero los procedimientos no.
*** Por ejemplo: -create
table <tablename>(name varchar(10),salary getsal(name))
Aquí getsal es una función definida por el usuario que devuelve un tipo de salario, cuando se crea la tabla no se asigna almacenamiento para el tipo de salario, y la función getsal tampoco se ejecuta, pero cuando estamos obteniendo algunos valores de esta tabla, la función getsal se ejecuta y el return El tipo se devuelve como el conjunto de resultados.
fuente
Me doy cuenta de que esta es una pregunta muy antigua, pero no veo un aspecto crucial mencionado en ninguna de las respuestas: alinearse en el plan de consulta.
Las funciones pueden ser ...
Escalar:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Valor de tabla de varias instrucciones:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Valor de tabla en línea:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
El optimizador de consultas trata el tercer tipo (valor de tabla en línea) esencialmente como vistas (parametrizadas), lo que significa que hacer referencia a la función desde su consulta es similar a copiar y pegar el cuerpo SQL de la función (sin copiar y pegar). a los siguientes beneficios:
Lo anterior puede conducir a ahorros de rendimiento potencialmente significativos, especialmente cuando se combinan múltiples niveles de funciones.
NOTA: Parece que SQL Server 2019 también presentará algún tipo de función escalar en línea.
fuente
En SQL Server, las funciones y el procedimiento almacenado son dos tipos diferentes de entidades.
Función: en la base de datos de SQL Server, las funciones se utilizan para realizar algunas acciones y la acción devuelve un resultado inmediatamente. Las funciones son de dos tipos:
Sistema definido
Usuario definido
Procedimientos almacenados: en SQL Server, los procedimientos almacenados se almacenan en el servidor y puede devolver valores cero, únicos y múltiples. Los procedimientos almacenados son de dos tipos:
fuente