Función versus procedimiento almacenado en SQL Server

831

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é?

Tarik
fuente
1
wiki.answers.com/Q/…
Freelancer
3
¿qué tal la velocidad? ¿Cuál ejecuta la misma consulta más rápido?
AmiNadimi

Respuestas:

708

Las funciones son valores calculados y no pueden realizar cambios ambientales permanentes en SQL Server(es decir, no se permiten INSERTo UPDATEdeclaraciones).

Una función se puede usar en línea en las SQLdeclaraciones 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:

Las funciones siguen la definición de informática en que DEBEN devolver un valor y no pueden alterar los datos que reciben como parámetros (los argumentos). Las funciones no pueden cambiar nada, deben tener al menos un parámetro y deben devolver un valor. Los procesos almacenados no tienen que tener un parámetro, pueden cambiar los objetos de la base de datos y no tienen que devolver un valor.

Cómo llamar a la SQLfunció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

MyItchyChin
fuente
13
Básicamente no se permite DML?
David Blaine
173
Las funciones siguen la definición de dominio de la computadora en que DEBEN devolver un valor y no pueden alterar los datos que reciben como parámetros (los argumentos). Las funciones no pueden cambiar nada, deben tener al menos un parámetro y deben devolver un valor. Los procesos almacenados no tienen que tener un parámetro, pueden cambiar los objetos de la base de datos y no tienen que devolver un valor.
Sean Anderson
23
De hecho, puede tener instrucciones INSERT, UPDATE y DELETE en una función, para modificar las variables de la tabla local.
Ani
14
@Ani: puede crear instancias y modificar cualquier número de variables locales en una función; sin embargo, no puede modificar nada fuera del alcance de la función.
MyItchyChin
40
La función @SeanKAnderson "debe tener al menos un parámetro" no es verdadera.
liang
624

La diferencia entre SP y UDF se enumera a continuación:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+
Bhaumik Patel
fuente
21
Las funciones deben devolver un valor o un conjunto.
Rafareino
8
Esto llegó 3 años después, pero debería estar en la cima porque es legible y extenso.
DanteTheSmith
SP puede usar tablas temporales y variables de tabla, mientras que UDF solo puede usar variables de tabla. Las variables de tabla a su vez no pueden usar índices. UDF se puede llamar en una APLICACIÓN CRUZADA a diferencia de SP
Ludovic Aubert
190

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 tableo SELECT 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:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

Donde MyFunction se declara como:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

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).

Chris J
fuente
2
¿Puede por favor elaborar "Los marcos como ADO.NET, etc. no pueden llamar a una función directamente"? He ejecutado funciones con proveedores de datos ADO.NET sin problemas.
Ian Kemp
24
Debe llamar a una función a través de una instrucción SELECT (no se puede invocar una función como un código independiente por derecho propio), se debe invocar como parte de una instrucción SQL más grande, incluso si esa instrucción SQL no es nada más. que SELECT * from dbo.MyTableValuedFunction(). Sprocs, por otro lado, se puede llamar directamente con ADO.NET estableciendo SqlCommand.CommandTypeen CommandType.StoredProcedure.
Chris J
60

Diferencias entre procedimientos almacenados y funciones definidas por el usuario:

  • Los procedimientos almacenados no se pueden usar en las sentencias Select.
  • Los procedimientos almacenados admiten la resolución de nombres diferidos.
  • Los procedimientos almacenados se utilizan generalmente para realizar la lógica empresarial.
  • Los procedimientos almacenados pueden devolver cualquier tipo de datos.
  • Los procedimientos almacenados pueden aceptar un mayor número de parámetros de entrada que las funciones definidas por el usuario. Los procedimientos almacenados pueden tener hasta 21,000 parámetros de entrada.
  • Los procedimientos almacenados pueden ejecutar SQL dinámico.
  • Los procedimientos almacenados admiten el manejo de errores.
  • Las funciones no deterministas se pueden usar en procedimientos almacenados.

  • Las funciones definidas por el usuario se pueden usar en las instrucciones Select.
  • Las funciones definidas por el usuario no admiten la resolución de nombres diferidos.
  • Las funciones definidas por el usuario generalmente se usan para los cálculos.
  • Las funciones definidas por el usuario deben devolver un valor.
  • Las funciones definidas por el usuario no pueden devolver imágenes.
  • Las funciones definidas por el usuario aceptan un número menor de parámetros de entrada que los procedimientos almacenados. Los UDF pueden tener hasta 1.023 parámetros de entrada.
  • Las tablas temporales no se pueden usar en funciones definidas por el usuario.
  • Las funciones definidas por el usuario no pueden ejecutar SQL dinámico.
  • Las funciones definidas por el usuario no admiten el manejo de errores. RAISEERRORO @@ERRORno están permitidos en UDF.
  • Las funciones no deterministas no se pueden usar en UDF. Por ejemplo, GETDATE()no se puede usar en UDF.
Kumar Manish
fuente
1
Para citar @curiousBoy a continuación re. otra respuesta no acreditada (por @Ankit) (<- ¿ves cómo hice eso?;)): "Deberías haber dado la referencia fuente. Esto es de ( blogs.msdn.microsoft.com/pradeepsvs/2014/10 / 08 / ... ). ¡Por favor respeta el trabajo que otros hacen! "
Tom
77
Estos blogs se escribieron desde el 8 de octubre de 2014 y esta respuesta se escribió desde el 2 de mayo de 2013 @Tom
Kumar Manish
1
@ Code Rider: ¡Ah, mis disculpas! ¡No puedo creer que no me haya dado cuenta! Entonces, ¿el blog te copió (o alguien más que lo hizo) sin crédito?
Tom
GETDATE()se puede usar en una función. El pivote sobre no determinista no es bueno.
PerformanceDBA
56

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!

Alex Martelli
fuente
18
Existen diferentes tipos de funciones definidas por el usuario. Los escalares devuelven solo valores; otros tipos recuperan conjuntos de resultados.
AK
44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.
Aakash Singh
fuente
1
UDF se puede llamar en una APLICACIÓN CRUZADA, a diferencia de SP
Ludovic Aubert
24

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

Ankit
fuente
25
Deberías haber dado la referencia fuente. Esto es de dotnet-tricks.com/Tutorial/sqlserver/… . ¡Respeta el trabajo que otros hacen!
curiousBoy
16
No es una razón para no dar una referencia fuente. ¡Puedes mencionarlo al final!
curiousBoy
2
Re. "La función debe devolver un valor, pero en el Procedimiento almacenado es opcional ...": aclararía que: "Las funciones deben devolver un solo valor (que debe hacerse mediante la Returnspalabra clave y debe ser un tipo Escalar o de Tabla) , pero los Procedimientos almacenados pueden devolver opcionalmente : a) 1 Inttipo de Código de resultado a través de la ReturnDeclaración y / o b) 1+ Parámetros (incluido el Cursortipo) a través de la Outputpalabra clave y / o c) 1+ Conjuntos de filas a través de Selectdeclaraciones. se devuelve, se puede usar como el argumento "execute_statement" de una instrucción "Insertar en".
Tom
20

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

SELECT a, lookupValue(b), c FROM customers 

donde lookupValuehabrá 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:

  • no puede crear cambios permanentes
  • no puede cambiar datos

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 abierta
fuente
14

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.

Tigerjz32
fuente
2
Este es un buen resumen de las dos formas rápidas y sucias de pensar en ellas.
Eric Bishard
2
De hecho un buen resumen. Otras respuestas se centran en la diferencia teórica de las dos, sin dejar de saber cuándo usar cuál en la práctica.
jf328
8

Procedimiento almacenado:

  • Es como un programa en miniatura en SQL Server.
  • Puede ser tan simple como una instrucción select o tan compleja como un script largo que agrega, elimina, actualiza y / o lee datos de múltiples tablas en una base de datos.
  • (Puede implementar bucles y cursores, que le permiten trabajar con resultados más pequeños u operaciones fila por fila en los datos).
  • Debe llamarse usando EXECo EXECUTEdeclaración.
  • Devuelve las variables de la tabla, pero no podemos usar el OUTparámetro.
  • Soporta transacciones.

Función:

  • No se puede usar para actualizar, eliminar o agregar registros a la base de datos.
  • Simplemente devuelve un valor único o un valor de tabla.
  • Solo se puede usar para seleccionar registros. Sin embargo, se puede llamar muy fácilmente desde SQL estándar, como:

    SELECT dbo.functionname('Parameter1')

    o

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • Para operaciones simples de selección reutilizables, las funciones pueden simplificar el código. Solo tenga cuidado con el uso de JOINcláusulas en sus funciones. Si su función tiene una JOINclá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.

  • Devuelve los valores usando el OUTparámetro.
  • No admite transacciones.
JaiSankarN
fuente
8

Función definida por el usuario.

  1. La función debe devolver un valor.
  2. Permitirá solo declaraciones Select, no nos permitirá usar declaraciones DML.
  3. Solo permitirá parámetros de entrada, no admite parámetros de salida.
  4. No nos permitirá usar bloques try-catch.
  5. Las transacciones no están permitidas dentro de las funciones.
  6. Solo podemos usar variables de tabla, no permitirá usar tablas temporales.
  7. Los procedimientos almacenados no se pueden invocar desde una función.
  8. Las funciones se pueden invocar desde una instrucción select.
  9. Se puede usar un UDF en una cláusula de unión como conjunto de resultados.

Procedimiento almacenado

  1. El procedimiento almacenado puede o no devolver valores.
  2. Puede tener sentencias de selección, así como sentencias DML como insertar, actualizar, eliminar, etc.
  3. Puede tener parámetros de entrada y salida.
  4. Para el manejo de excepciones podemos usar try catch blocks.
  5. Puede usar transacciones dentro de procedimientos almacenados.
  6. Puede usar tanto las variables de tabla como la tabla temporal en ella.
  7. Los procedimientos almacenados pueden llamar a funciones.
  8. Los procedimientos no se pueden invocar desde Seleccionar / Dónde / Tener, etc. La instrucción Execute / Exec se puede usar para llamar / ejecutar Procedimiento almacenado.
  9. Los procedimientos no se pueden usar en la cláusula Join
Mahesh Waghmare
fuente
6

Para decidir cuándo usar lo que podrían ayudar los siguientes puntos:

  1. Los procedimientos almacenados no pueden devolver una variable de tabla donde una función puede hacer eso.

  2. Puede usar procedimientos almacenados para alterar los parámetros del entorno del servidor donde, al usar funciones, no puede.

salud

Arnkrishn
fuente
6

¡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.

  1. Nunca use una función para devolver un conjunto de resultados a un código externo (como ADO.Net)
  2. Utilice la combinación de vistas / procesos almacenados tanto como sea posible. puede recuperarse de futuros problemas de rendimiento de crecimiento utilizando las sugerencias que DTA (Asesor de ajuste de base de datos) le daría (como vistas indexadas y estadísticas), ¡a veces!

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

Aquiles
fuente
1
Gracias. Escribió una función hoy para llamar dentro de una consulta para rellenar valores para una columna. Ejecutar ejecutó durante más de 3 minutos antes de que lo detuviera. Descubrí una forma de UNIRSE para hacerlo. Ejecutar terminado en 15 segundos. (El conjunto de datos fue de 3456 filas). Gran rendimiento dif.
VISQL
editar: Ejecutar termina entre 15 y 50 segundos dependiendo de qué columna "ORDENAR POR" (el conjunto de datos fue de 3456 filas). Gran diferencia de rendimiento.
VISQL
La diferencia de rendimiento puede tener raíces en diferentes tipos de esas columnas por las que está ordenando el resultado. SQL Server funciona mucho mejor con números que con datos de caracteres. Puede usar DTA en esa consulta de 50 segundos y ver si puede aportar algún tipo de estadísticas / sugerencias de índice para que la consulta se ejecute un poco más rápido.
Aquiles
1
No estoy seguro de que se haya proporcionado suficiente evidencia para decir que debería ser un último recurso. Puede pensar en una función como una vista parametrizada que se puede seguir operando. Por ejemplo, desea unir clientes a pedidos, pero solo para Michigan. Cree una función customerOrders (@StateCode) que solo unirá el valor de un solo estado del cliente. Entonces, puedo seguir operando en este conjunto como Seleccionar nombre, Apellido, Total de pedido, Nombre de tienda de órdenes de cliente ('MI') INNER JOIN Tiendas EN Stores.StoreID = Orders.StoreID DONDE OrderTotal> 100; Esto sería un problema con los SP, ya que debe copiar temporalmente.
MPavlak
¿Cuántos registros tienes en esa tabla? Si su hardware lo maneja adecuadamente, no tendrá que preocuparse por elegir armas. Una cuchara puede hacer el trabajo cuando es suficientemente difícil romper una espada; ¡Esta dureza se llama HARDWARE!
Aquiles
3

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.

Andrés
fuente
3

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 execinstrucció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 )

usuario2023861
fuente
2
  • Es obligatorio que Function devuelva un valor mientras no es para un procedimiento almacenado.
  • Las declaraciones de selección solo se aceptan en UDF, mientras que las declaraciones de DML no son necesarias.
  • El procedimiento almacenado acepta las declaraciones y las declaraciones DML.
  • UDF solo permite entradas y no salidas.
  • El procedimiento almacenado permite tanto entradas como salidas.
  • Los bloques de captura no se pueden usar en UDF pero se pueden usar en procedimientos almacenados.
  • No se permiten transacciones en funciones en UDF pero sí en procedimientos almacenados.
  • Solo se pueden usar variables de tabla en UDF y no tablas temporales.
  • El procedimiento almacenado permite tanto las variables de tabla como las tablas temporales.
  • UDF no permite que se invoquen procedimientos almacenados desde funciones, mientras que los procedimientos almacenados permiten invocar funciones.
  • UDF se usa en la cláusula de unión, mientras que los procedimientos almacenados no se pueden usar en la cláusula de unión.
  • El procedimiento almacenado siempre permitirá volver a cero. UDF, por el contrario, tiene valores que deben regresar a un punto predeterminado.
kombsh
fuente
1
  • 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.

Nick Kahn
fuente
1

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 ...

  1. Escalar:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. Valor de tabla de varias instrucciones:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. 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:

  • El planificador de consultas puede optimizar la ejecución de la función en línea como lo haría con cualquier otra subconsulta (por ejemplo, eliminar columnas no utilizadas, empujar predicados hacia abajo, elegir diferentes estrategias de UNIÓN, etc.).
  • La combinación de varias funciones en línea no requiere materializar el resultado del primero antes de pasarlo al siguiente.

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.

Branko Dimitrijevic
fuente
-2

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:

  1. Sistema definido

  2. 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:

  1. Procedimientos almacenados del sistema
  2. Procedimientos definidos por el usuario
Jason Clark
fuente