Funciones (motor de base de datos)

SQL Server ofrece funciones integradas que se pueden utilizar para realizar determinadas operaciones.

Las funciones se pueden usar o incluir en:

  • La lista de selección de una consulta que usa una instrucción SELECT para devolver un valor.

    SELECT DB_NAME();
    GO
    
  • Una condición de búsqueda de una cláusula WHERE de una instrucción SELECT o de modificación de datos (SELECT, INSERT, DELETE o UPDATE) para limitar las filas adecuadas para la consulta.

    USE AdventureWorks;
    GO
    SELECT SalesOrderID, ProductID, OrderQty
    FROM Sales.SalesOrderDetail
    WHERE OrderQty =
       (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail);
    GO
    
  • La condición de búsqueda (condición WHERE) de una vista para hacer que la vista se adapte dinámicamente al usuario o entorno en tiempo de ejecución.

    CREATE VIEW ShowMyEmploymentInfo AS
    SELECT FirstName, LastName
    FROM Person.Contact
    WHERE ContactID = SUSER_SID();
    GO
    
  • Cualquier expresión.

  • Un desencadenador o restricción CHECK para buscar los valores especificados cuando se insertan datos.

    CREATE TABLE SalesContacts
       (SalesRepID   INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ),
       ContactName   VARCHAR(50) NULL,
       ContactPhone   VARCHAR(13) NULL);
    GO
    
  • Un desencadenador o restricción DEFAULT para suministrar un valor en el caso de que no se especifique ninguno por parte de una instrucción INSERT.

    CREATE TABLE SalesContacts
       (
       SalesRepID   INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ),
       ContactName   VARCHAR(50) NULL,
       ContactPhone   VARCHAR(13) NULL,
       WhenCreated   DATETIME DEFAULT GETDATE(),
       Creator      INT DEFAULT SUSER_SID()
       );
    GO
    

Las funciones se especifican con paréntesis, incluso si no hay parámetros. Las excepciones son las funciones niládicas que se utilizan con la palabra clave DEFAULT. Las funciones niládicas no aceptan parámetros. Para obtener más información acerca de la palabra clave DEFAULT, vea ALTER TABLE (Transact-SQL) y CREATE TABLE (Transact-SQL).

Algunas veces, los parámetros que especifican una base de datos, equipo, inicio de sesión o usuario de base de datos son opcionales. Si no se proporcionan, el valor predeterminado es el de la base de datos, equipo host, inicio de sesión o usuario de base de datos actual.

Las funciones se pueden anidar.

Categorías de funciones

La siguiente lista enumera las categorías de las funciones de SQL Server.

Categoría de la función

Descripción

Funciones de agregado (Transact-SQL)

Realizan operaciones que combinan varios valores en uno. Ejemplos son COUNT, SUM, MIN y MAX.

Funciones de configuración

Funciones escalares que devuelven información acerca de la configuración.

Funciones de cifrado (Transact-SQL)

Admiten cifrado, descifrado, firma digital y la validación de firmas digitales.

Funciones del cursor

Devuelven información acerca del estado de un cursor.

Funciones de fecha y hora

Cambian los valores de fecha y hora.

Funciones matemáticas

Realizan operaciones trigonométricas, geométricas y demás operaciones numéricas.

Funciones de metadatos

Devuelven información acerca de los atributos de las bases de datos y de los objetos de base de datos.

Funciones de categoría

Funciones no deterministas que devuelven un valor de categoría para cada fila en una partición.

Funciones de conjuntos de filas (Transact-SQL)

Devuelven los conjuntos de filas que se pueden usar en el lugar de una referencia de tabla de una instrucción de Transact-SQL.

Funciones de seguridad

Devuelven información acerca de usuarios y funciones.

Funciones de cadena

Cambian los valores de char, varchar, nchar, nvarchar, binary y varbinary.

Funciones del sistema

Funcionan e informan acerca de varias opciones y objetos del sistema.

Funciones estadísticas del sistema (Transact-SQL)

Devuelven información sobre el rendimiento de SQL Server.

Funciones de texto e imagen

Cambian los valores de text y image.

Funciones deterministas y no deterministas

En SQL Server, las funciones se clasifican como estrictamente deterministas o no deterministas.

Una función es estrictamente determinista si, para un conjunto específico de valores de entrada, la función siempre devuelve los mismos resultados.

En el caso de funciones definidas por el usuario, se aplica una noción menos rígida de determinismo. Una función definida por el usuario es estrictamente determinista si, para un conjunto específico de valores de entrada y el estado de una base de datos, la función siempre devuelve los mismos resultados. Si la función no es estrictamente determinista, puede ser determinista en este sentido si tiene acceso a datos.

Una función no determinista puede devolver diferentes resultados si se llama repetidamente con el mismo conjunto de valores de entrada. Por ejemplo, la función GETDATE() es no determinista. SQL Server impone restricciones en diversas clases de no determinismo. Por tanto, las funciones no deterministas deben utilizarse con cuidado.

En el caso de las funciones integradas, el determinismo y el determinismo estricto son lo mismo. En el caso de las funciones definidas por el usuario Transact-SQL, el sistema comprueba la definición e impide la definición de funciones no deterministas. Sin embargo, una función de acceso a datos o vinculada no a esquema se considera no estrictamente determinista. En el caso de funciones CLR (Common Language Runtime), las definiciones de las funciones especifican el determinismo, el acceso a datos y las propiedades del acceso a datos del sistema de la función, pero como estas propiedades no son comprobadas por el sistema, siempre se consideran no estrictamente deterministas.

La falta de determinismo de una función puede limitar los lugares en los que se puede usar. Únicamente las funciones deterministas pueden invocarse en vistas indizadas, columnas calculadas indizadas, columnas calculadas persistentes o definiciones de funciones definidas por el usuario Transact-SQL.

La falta de determinismo estricto de una función puede bloquear optimizaciones de rendimiento valiosas. Algunos pasos de la reordenación del plan se omiten para preservar la corrección de una manera conservadora. Además, el número, el orden y la sincronización de las llamadas a las funciones definidas por el usuario dependen de la implementación. No confíe en esta semántica de invocación. Aparte de las funciones RAND integradas no deterministas de las constantes de tiempo de ejecución y de la familia GETDATE, el número, el orden y la sincronización de las llamadas dependerán del plan elegido.

Prácticas recomendadas

Le recomendamos que siga las siguientes directrices siempre que sea posible:

1. Escriba funciones estrictamente deterministas siempre que pueda elegir. En concreto, haga que las funciones Transact-SQL estén vinculadas a un esquema.

2. Limite el uso de las funciones no deterministas a las listas de selección externas.

3. No utilice funciones no deterministas en consultas cruciales para el rendimiento.

4. No confíe en el número, el orden o la sincronización de las llamadas ya que dependen de la implementación.

Para obtener más información, vea Funciones deterministas y no deterministas.