functions en sql server 2005

Upload: juan-carlos-acosta

Post on 18-Jul-2015

65 views

Category:

Documents


0 download

TRANSCRIPT

Stored Procedures y Functions en SQL Server 2005 IIPosted on May 28, 2008 by justindeveloper

Functions en SQL Server 2005Al igual que las funciones en los lenguajes de programacin, las funciones definidas por el usuario de Microsoft SQL Server 2005 son rutinas que aceptan parmetros, realizan una accin, como un clculo complejo, y devuelven el resultado de esa accin como un valor. El valor devuelto puede ser un valor escalar nico o un conjunto de resultados. Ventajas de las funciones definidas por el usuario Permiten una ejecucin ms rpida. Al igual que los stored procedures, las funciones definidas por el usuario Transact-SQL reducen el costo de compilacin del cdigo Transact-SQL almacenando los planes en la cach y reutilizndolos para ejecuciones repetidas Esto significa que no es necesario volver a analizar y optimizar la funcin definida por el usuario con cada uso, lo que permite obtener tiempos de ejecucin mucho ms rpidos. Las funciones CLR ofrecen una ventaja de rendimiento importante sobre las funciones Transact-SQL para tareas de clculo, manipulacin de cadenas y lgica empresarial. Las funciones Transact-SQL se adecuan mejor a la lgica intensiva del acceso a datos. Pueden reducir el trfico de red. Una operacin que filtra datos basndose en restricciones complejas que no se puede expresar en una sola expresin escalar se puede expresar como una funcin. La funcin se puede invocar en la clusula WHERE para reducir el nmero de filas que se envan al cliente.

Tipos de funciones Funciones escalaresLas funciones escalares definidas por el usuario devuelven un nico valor de datos del tipo definido en la clusula RETURNS. Las funciones escalares en lnea no tienen cuerpo; el valor escalar es el resultado de una sola instruccin. Para una funcin escalar de mltiples instrucciones, el cuerpo de la funcin, definido en un bloque BEGINEND, contiene una serie de instrucciones Transact-SQL que devuelven el valor nico Demo:

IF OBJECT_ID (Ndbo.ufnGetInventoryStock, NFN) IS NOT NULL DROP FUNCTION ufnGetInventoryStock; GO CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int) RETURNS int AS Returns the stock level for the product. BEGIN DECLARE @ret int; SELECT @ret = SUM(p.Quantity) FROM Production.ProductInventory p WHERE p.ProductID = @ProductID AND p.LocationID = 6; IF (@ret IS NULL) SET @ret = 0 RETURN @ret END; GO Utilizando la nueva function SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS CurrentSupply FROM Production.Product WHERE ProductModelID BETWEEN 75 and 80; Funciones con valores de tabla

Las funciones con valores de tabla definidas por el usuario devuelven un tipo de datos table. Las funciones con valores de tabla en lnea no tienen cuerpo; la tabla es el conjunto de resultados de una sola instruccin SELECT

Demo: Creando una Funcion con valores de tabla en linea IF OBJECT_ID (NSales.ufn_SalesByStore, NIF) IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS

RETURN ( SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS YTD Total FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID WHERE SH.CustomerID = @storeid GROUP BY P.ProductID, P.Name); GO Utilizando la ufn_SalesByStore function SELECT * FROM Sales.ufn_SalesByStore (602);Para una funcin con valores de tabla de mltiples instrucciones, el cuerpo de la funcin, definido en un bloque BEGINEND, contiene una serie de instrucciones Transact-SQL que generan e insertan filas en la tabla que se va a devolver.

Demo: Creando una Funcion con valores de tabla de multiples instrucciones: CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER) RETURNS @retFindReports TABLE ( EmployeeID int primary key NOT NULL, Name nvarchar(255) NOT NULL, Title nvarchar(50) NOT NULL, EmployeeLevel int NOT NULL, Sort nvarchar (255) NOT NULL ) Returns a result set that lists all the employees who report to the specific employee directly or indirectly.*/ AS BEGIN WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS (SELECT CONVERT(Varchar(255), c.FirstName + + c.LastName), e.Title, e.EmployeeID,1, CONVERT(Varchar(255), c.FirstName + + c.LastName) FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID = @InEmpID UNION ALL SELECT CONVERT(Varchar(255), REPLICATE (| , EmployeeLevel) + c.FirstName + + c.LastName), e.Title,

EmployeeID, EmployeeLevel + 1, CONVERT (Varchar(255), RTRIM(Sort) + | + FirstName + + LastName) FROM HumanResources.Employee as e JOIN Person.Contact AS c ON e.ContactID = c.ContactID JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID ) copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, Name, Title, EmployeeLevel, Sort FROM DirectReports RETURN END; GO Example invocation SELECT EmployeeID, Name, Title, EmployeeLevel FROM dbo.ufn_FindReports(109) ORDER BY Sort; Funciones integradas

SQL Server proporciona las funciones integradas para ayudarle a realizar diversas operaciones. No se pueden modificar. Puede utilizar funciones integradas en instrucciones Transact-SQL para: Tener acceso a informacin de las tablas del sistema de SQL Server sin tener acceso a las tablas del sistema directamente. Realizar tareas habituales como SUM, GETDATE o IDENTITY. Las funciones definidas por el usuario se han ampliado en Microsoft SQL Server 2005 para incluir las funciones escritas en cualquier lenguaje de programacin que se admita en Microsoft .NET Framework Remember: Las funciones en lnea pueden utilizarse para obtener la funcionalidad de vistas con parmetros. No obstante, las vistas no admiten parmetros en las condiciones de bsqueda especificadas en la clusula WHERE. Las funciones en lnea definidas por el usuario pueden utilizarse para admitir parmetros en las condiciones de bsqueda especificadas en la clusula WHERE. No se recomienda el uso de funciones definidas por el usuario que producen efectos secundarios en la base de datos. Cuando se llama desde una funcin, el procedimiento almacenado extendido no puede devolver conjuntos de resultados al cliente

En general, si el procedimiento almacenado devuelve un solo conjunto de resultados, defina una funcin con valores de tabla. Para las funciones con valores de tabla no son necesarias las instrucciones EXECUTE dinmicas Las funciones CLR suponen una alternativa ms confiable y escalable frente a los procedimientos almacenados extendidos. Muchos procedimientos almacenados extendidos realizan tareas de clculo que son difciles de expresar en TransactSQL Adems, los procedimientos almacenados extendidos que devuelven conjuntos de resultados mediante el acceso a un recurso externo, como un archivo o un servicio Web, se pueden volver a escribir mediante una funcin con valores de tabla CLR.

SQL Server 2008 admite las funciones definidas por el usuario y las funciones del sistema integradas. Al igual que las funciones en los lenguajes de programacin, las funciones definidas por el usuario de son rutinas que aceptan parmetros, realizan una accin, como un clculo complejo, y devuelven el resultado de esa accin como un valor. El valor devuelto puede ser un valor escalar nico o un conjunto de resultados.

Funciones escalares.Las funciones escalares son las ms parecidas a las funciones que se utilizan dentro de los lenguajes de programacin. Se utilizan bsicamente para clculos bsicos matemticos ya que devuelven un nico valor escalar. ejemplo: Calculo del IVA: --Creamos la funcion conel nombre IVA -- Indicamos el parmetro de entrada y tipo: @cantidad money Create function IVA (@cantidad money) Returns money -- Indicamos el tipo de parmetros que retornar la funcin. as -- Encapsulamos el conjunto de funciones dentro de un Begin y un end. Begin -- Dentro de la sentencia o funcion podemos manejar variables --aunque puede no ser necesario para ser ms eficiente la funcin. -- por cuestiones de ejemplo usamos la variable @resultado Declare @resultado money set @resultado = @cantidad * 0.16

-- Cuando terminamos la funcin ponemos el Return Return (@resultado) -- Y la variable que devolver la funcin @resultado. end

Para llamar a la funcin la llamamos con un nombre de dos partes, con el esquema.funcion mas el parametro que requiere la funcion:

Select campo_producto, campo_unidadprecio, dbo.iva(campo_unidadprecio) as iva from tabla

Funciones con valores de tabla de varias instrucciones y Funciones con valores de tablas en lnea

A groso modo y solo para simplificar, son un hibrido entre vista y procedimiento almacenado, ya que suelen ser consultas con una instruccin select, pero que pueden recibir parmetros, cosa que no puede hacer una vista y si un procedimiento desde la versin sql server 2008 en adelante. Un procedimiento almacenado es ms poderoso, ya que puede encapsular insert, update, delete o un conjunto de instrucciones SQL De todas formas si se puede recomiendo que se trabajes con procedimientos almacenados en lugar de con funciones, dentro de lo posible... ya que desde sql 2008 se puedes pasar variables tipo tabla (arrays) a procedimientos almacenados... (http://microsoftsqlsecret.fullblog.com.ar/stored-procedure-with-array-parameters-comopasamos-variables-tipo-ta.html) Funciones con valores de tabla de varias instrucciones: --Creamos una funcin que se le ingrese por parmetro el pas y devuelva los clientes de ese pas: Create function ListadoPais (@pais varchar(100)) returns @clientes table -- Decimos que retornamos como resultado una variable de tipo tabla y la declaramos (customerid varchar(5), companyname varchar(50), -- Se definen las columnas que se necesiten contactname varchar(100), country varhcar(100) ) as -- Iniciamos la funcin. La variable tipo tabla @clientes es la que vamos a devolver como resultado de la funcin begin

Insertamos a la variabla tipo tabla @clientes: Insert @clientes select customerid, companyname, contactname, country from customers where country = @pais -- variable @pais de entrada en la funcin Return end

Para ver la funcin funcionando: Select * from dbo.ListadoPais('Argentina')

Funciones con valores de tablas en lnea: A diferencia de la anterior (funciones con valores de tabla), es una funcin con valores de tabla en lnea. Create funcion ListadoPais2 (@pais varchar(100)) returns table as return ( select customerid, companyname, contactname, country from customers where country = @pais )

137 - Funciones con valores de tabla en lneaUna funcin con valores de tabla en lnea retorna una tabla que es el resultado de una nica instruccin "select". Es similar a una vista, pero ms flexible en el empleo de parmetros. En una vista no se puede incluir un parmetro, lo que hacemos es agregar una clusula "where" al ejecutar la vista. Las funciones con valores de tabla en lnea funcionan como una vista con parmetros. Sintaxis:create function NOMBREFUNCION (@PARAMETRO TIPO=VALORPORDEFECTO) returns table as return ( select CAMPOS from TABLA where CONDICION );

Como todas las funciones definidas por el usuario, se crea con "create function" seguido del nombre que le damos a la funcin; luego declaramos los parmetros de entrada con su tipo de dato entre parntesis. El valor por defecto es opcional. "returns" especifica "table" como el tipo de datos a retornar. No se define el formato de la tabla a retornar porque queda establecido en el "select". El cuerpo de la funcin no contiene un bloque "begin...end" como las otras funciones. La clusula "return" contiene una sola instruccin "select" entre parntesis. El resultado del "select" es la tabla que se retorna. El "select" est sujeto a las mismas reglas que los "select" de las vistas. Creamos una funcin con valores de tabla en lnea que recibe un valor de autor como parmetro:create function f_libros (@autor varchar(30)='Borges') returns table as return ( select titulo,editorial from libros where autor like '%'+@autor+'%'

);

Estas funciones retornan una tabla y se hace referencia a ellas en la clusula "from", como una vista:select *from f_libros('Bach');

Recuerde a que todas las funciones que tienen definidos parmetros se les DEBE suministrar valores para ellos al invocarse. Recuerde que para que el parmetro tome el valor por defecto (si lo tiene) DEBE enviarse "default" al llamar a la funcin; si no le enviamos parmetros, SQL Server muestra un mensaje de error.--incorrecto: select *from f_libros(); select *from f_libros(default);--correcto

Funciones definidas por el usuario con valores de tablaSQL Server 2008 R2 Otras versiones

SQL Server 2008 SQL Server 2005

Personas que lo han encontrado til: 0 de 1 Valorar este tema

Las funciones definidas por el usuario que devuelven un tipo de datos table pueden ser unas eficaces alternativas a las vistas. Esas funciones se conocen como funciones con valores de tabla. Una funcin definida por el usuario con valores de tabla se puede usar donde se permiten las expresiones de vista o de tabla en las consultas Transact-SQL. Mientras que las vistas se limitan a una nica instruccin SELECT, las funciones definidas por el usuario pueden contener instrucciones adicionales que permiten una lgica ms eficaz que en las vistas. Una funcin definida por el usuario con valores de tabla tambin puede reemplazar procedimientos almacenados que devuelven un solo conjunto de resultados. En la clusula FROM de una instruccin Transact-SQL es posible hacer referencia a la tabla que devuelve una funcin definida por el usuario, pero esto no es posible con los procedimientos almacenados que devuelven conjuntos de resultados.Componentes de una funcin definida por el usuario con valores de tabla

En una funcin definida por el usuario con valores de tabla:

La clusula RETURNS define el nombre de una variable de retorno local para la tabla devuelta por la funcin. La clusula RETURNS tambin define el formato de la tabla. El nombre de una variable de retorno local tiene un mbito local dentro de la funcin. Las instrucciones Transact-SQL del cuerpo de la funcin generan e insertan filas en la variable de retorno definida por la clusula RETURNS.

Al ejecutar una instruccin RETURN, las filas insertadas en la variable se devuelven desde la funcin en formato tabular. La instruccin RETURN no puede tener un argumento.

Ninguna instruccin Transact-SQL de una funcin con valores de tabla puede devolver un conjunto de resultados directamente a un usuario. La nica informacin que la funcin puede devolver al usuario es el tipo de datos table devuelto por la funcin.Nota

La opcin de tabla text in row se define automticamente en 256 para una tabla devuelta por una funcin definida por el usuario. Esto no puede modificarse. Las instrucciones READTEXT, WRITETEXT y UPDATETEXT no pueden utilizarse para leer o escribir partes de las columnas text, ntext e image de la tabla. Para obtener ms informacin, vea Datos consecutivos.Ejemplo

En el siguiente ejemplo se crea la funcin dbo.ufnGetContactInformation y se muestran los componentes de la funcin con valores de tabla. En esta funcin, el nombre de la variable de retorno local es @retContactInformation. Las instrucciones del cuerpo de la funcin insertan filas en esta variable para generar la tabla resultante devuelta por la funcin.SQL CopiarUSE AdventureWorks2008R2; GO IF OBJECT_ID(N'dbo.ufnGetContactInformation', N'TF') IS NOT NULL DROP FUNCTION dbo.ufnGetContactInformation; GO CREATE FUNCTION dbo.ufnGetContactInformation(@ContactID int) RETURNS @retContactInformation TABLE ( -- Columns returned by the function ContactID int PRIMARY KEY NOT NULL, FirstName nvarchar(50) NULL, LastName nvarchar(50) NULL, JobTitle nvarchar(50) NULL, ContactType nvarchar(50) NULL ) AS -- Returns the first name, last name, job title, and contact type for the specified contact. BEGIN DECLARE @FirstName nvarchar(50), @LastName nvarchar(50), @JobTitle nvarchar(50), @ContactType nvarchar(50);

-- Get common contact information SELECT @ContactID = BusinessEntityID, @FirstName = FirstName, @LastName = LastName FROM Person.Person WHERE BusinessEntityID = @ContactID; -- Get contact job title SELECT @JobTitle = CASE -- Check for employee WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM') THEN (SELECT JobTitle FROM HumanResources.Employee AS e WHERE e.BusinessEntityID = @ContactID) -- Check for vendor WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC') THEN (SELECT ct.Name FROM Person.ContactType AS ct INNER JOIN Person.BusinessEntityContact AS bec ON bec.ContactTypeID = ct.ContactTypeID WHERE bec.PersonID = @ContactID) -- Check for store WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC') THEN (SELECT ct.Name FROM Person.ContactType AS ct INNER JOIN Person.BusinessEntityContact AS bec ON bec.ContactTypeID = ct.ContactTypeID WHERE bec.PersonID = @ContactID) ELSE NULL END; -- Get contact type SET @ContactType = CASE -- Check for employee WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'EM') THEN 'Employee' -- Check for vendor WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'VC') THEN 'Vendor Contact' -- Check for store WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'SC') THEN 'Store Contact' -- Check for individual consumer

WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'IN') THEN 'Consumer' -- Check for general contact WHEN EXISTS(SELECT * FROM Person.Person AS p WHERE p.BusinessEntityID = @ContactID AND p.PersonType = 'GC') THEN 'General Contact' END; -- Return the information to the caller IF @ContactID IS NOT NULL BEGIN INSERT @retContactInformation SELECT @ContactID, @FirstName, @LastName, @JobTitle, @ContactType; END; RETURN; END; GO

En el siguiente ejemplo se utiliza la funcin con valores de tabla dbo.ufnGetContactInformation en la clusula FROM de dos instrucciones SELECT.SQL CopiarUSE AdventureWorks2008R2; GO SELECT ContactID, FirstName, LastName, JobTitle, ContactType FROM dbo.ufnGetContactInformation(1209); GO SELECT ContactID, FirstName, LastName, JobTitle, ContactType FROM dbo.ufnGetContactInformation(5); GO

Ejecutar funciones definidas por el usuario (motor de base de datos)SQL Server 2005 Otras versiones

SQL Server 2012 SQL Server 2008 R2 SQL Server 2008

Este tema an no ha recibido ninguna valoracin Valorar este tema Actualizado: 14 de abril de 2006

Las funciones definidas por el usuario se pueden invocar en consultas o en otras instrucciones o expresiones, como columnas calculadas o expresiones de cadena. Las funciones con valores escalares se pueden ejecutar mediante la instruccin EXECUTE.Invocar funciones definidas por el usuario que devuelven un valor escalar

Puede invocar una funcin definida por el usuario que devuelve un valor escalar en cualquier parte de una expresin escalar del mismo tipo de datos que se permite en las instrucciones Transact-SQL. Las funciones con valores escalares deben invocarse como mnimo con el nombre de dos partes de la funcin. Para obtener ms informacin sobre los nombres con varias partes, vea Convenciones de sintaxis de Transact-SQL (Transact-SQL).Consultas

En estas ubicaciones se permiten funciones definidas por el usuario que devuelven valores escalares:

Como expression de select_list de una instruccin SELECT: CopiarUSE AdventureWorks;

GO SELECT ProductID, ListPrice, dbo.ufnGetProductDealerPrice(ProductID, StartDate) AS DealerPrice, StartDate, EndDate FROM Production.ProductListPriceHistory WHERE ListPrice > .0000 ORDER BY ProductID, StartDate; GO

Como expression o string_expression en un predicado de clusula WHERE o HAVING: CopiarUSE AdventureWorks; GO SELECT ProductID, ListPrice, StartDate, EndDate FROM Production.ProductListPriceHistory WHERE dbo.ufnGetProductDealerPrice(ProductID, StartDate) > .0000 ORDER BY ProductID, StartDate; GO

Como group_by_expression en una clusula GROUP BY. Como order_by_expression en una clusula ORDER BY. Como expression en la clusula SET de una instruccin UPDATE: CopiarUSE AdventureWorks; GO UPDATE Production.ProductListPriceHistory SET ListPrice = dbo.ufnGetProductDealerPrice(ProductID, StartDate) WHERE ProductID > 900; GO

Como expression en la clusula VALUES de una instruccin INSERT: Las funciones definidas por el usuario a las que se hace referencia en estas ubicaciones se ejecutan lgicamente una vez por fila.

Restricciones CHECK

Las funciones definidas por el usuario que devuelven valores escalares se pueden invocar en restricciones CHECK si los valores de argumento transferidos a la funcin slo hacen referencia a columnas o constantes en la tabla. Cada vez que el procesador de consultas comprueba la restriccin, el procesador de consultas llama a la funcin con los valores de argumento asociados a la fila que se est comprobando actualmente. El propietario de una tabla tambin debe ser el propietario de la funcin definida por el usuario invocada por una restriccin CHECK de una tabla.

Definiciones DEFAULT

Las funciones definidas por el usuario se pueden invocar como constant_expression de definiciones DEFAULT si los valores de argumentos transferidos a la funcin slo contienen constantes. El propietario de la tabla tambin debe ser el propietario de la funcin definida por el usuario invocada por una definicin DEFAULT de una tabla.Columnas calculadas

Es posible invocar funciones mediante columnas calculadas si los valores de argumentos transferidos a la funcin slo hacen referencia a columnas o constantes de una tabla. El propietario de la tabla tambin debe ser el propietario de la funcin definida por el usuario invocada por una columna calculada de una tabla.Operadores de asignacin

Los operadores de asignacin (left_operand = right_operand) pueden invocar funciones definidas por el usuario que devuelven un valor escalar en la expresin especificada como operando derecho.Instrucciones de control de flujo

Las funciones definidas por el usuario que devuelven valores escalares se pueden invocar mediante instrucciones de control de flujo en sus expresiones booleanas.Expresiones CASE

Las funciones definidas por el usuario que devuelven un valor escalar se pueden invocar en cualquiera de las expresiones CASE.Instrucciones PRINT

Las funciones definidas por el usuario que devuelven una cadena de caracteres se pueden invocar como expresin string_expr de instrucciones PRINT.Funciones y procedimientos almacenados

Los argumentos de funciones tambin pueden hacer referencia a una funcin definida por el usuario que devuelve un valor escalar. Las instrucciones RETURN integer_expression de procedimientos almacenados pueden llamar a funciones definidas por el usuario que devuelven un entero como integer_expression. Las instrucciones RETURN return_type_spec de funciones definidas por el usuario pueden invocar a funciones definidas por el usuario que devuelven un tipo de datos escalar como return_type_spec, con tal de que el valor devuelto por la funcin definida por el usuario

que se invoca pueda convertirse implcitamente en el tipo de datos de vuelta de la funcin que realiza la invocacin. Ejecutar funciones definidas por el usuario que devuelven un valor escalar

Puede ejecutar funciones definidas por el usuario que devuelven valores escalares de la misma forma que si se tratara de procedimientos almacenados. Cuando ejecute una funcin definida por el usuario que devuelve un valor escalar, los parmetros se especifican del mismo modo que para los procedimientos almacenados:

Los valores de argumento no se incluyen entre parntesis. Se pueden especificar nombres de parmetros. Si se especifican nombres de parmetros, los valores de argumento no tienen que estar en la misma secuencia que los parmetros.

En el siguiente ejemplo se crea una funcin definida por el usuario que devuelve un valor escalar decimal.CopiarIF OBJECT_ID(N'dbo.ufn_CubicVolume', N'FN') IS NOT NULL DROP FUNCTION dbo.ufn_CubicVolume; GO CREATE FUNCTION dbo.ufn_CubicVolume -- Input dimensions in centimeters. (@CubeLength decimal(4,1), @CubeWidth decimal(4,1), @CubeHeight decimal(4,1) ) RETURNS decimal(12,3) -- Cubic Centimeters. WITH SCHEMABINDING AS BEGIN RETURN ( @CubeLength * @CubeWidth * @CubeHeight ) END; GO

El siguiente ejemplo ejecuta la funcin dbo.ufn_CubicVolume. Mediante la instruccin EXECUTE de Transact-SQL, los argumentos se identifican en un orden distinto al de los parmetros en la definicin de la funcin:CopiarDECLARE @MyDecimalVar decimal(12,3); EXEC @MyDecimalVar = dbo.ufn_CubicVolume @CubeLength = 12.3, @CubeHeight = 4.5, @CubeWidth = 4.5; SELECT @MyDecimalVar; GO

El siguiente ejemplo ejecuta la funcin dbo.ufn_CubicVolume sin especificar los nombres de parmetros:CopiarDECLARE @MyDecimalVar decimal(12,3); EXEC @MyDecimalVar = dbo.ufn_CubicVolume 12.3, 4.5, 4.5; SELECT @MyDecimalVar; GO

Tambin puede utilizar la sintaxis CALL de ODBC para ejecutar la funcin dbo.ufn_CubicVolume desde aplicaciones OLE DB u ODBC:Copiar-- First use SQLBindParam to bind the return value parameter marker -- to a program variable of the appropriate type SQLExecDirect(hstmt, "{ CALL ? = dbo.ufn_CubicVolume(12.3, 4.5, 4.5) }", SQL_NTS);

Invocar funciones definidas por el usuario que devuelven un tipo de datos table

Puede invocar una funcin definida por el usuario que devuelve una table, donde se permiten expresiones de tabla en la clusula FROM de instrucciones SELECT, INSERT, UPDATE o DELETE. Una invocacin de una funcin definida por el usuario que devuelve una tabla puede estar seguida de un alias de tabla opcional. En el ejemplo siguiente se ilustra la llamada a la funcin con valores de tabla dbo.ufnGetContactInformation en la clusula FROM de una instruccin SELECT.CopiarUSE AdventureWorks; GO SELECT ContactID, FirstName, LastName, JobTitle, ContactType FROM dbo.ufnGetContactInformation(2200); GO SELECT ContactID, FirstName, LastName, JobTitle, ContactType FROM dbo.ufnGetContactInformation(5); GO

Cuando una funcin definida por el usuario que devuelve una tabla (table) se invoca en la clusula FROM de una subconsulta, los argumentos de la funcin no pueden hacer referencia a columnas de la consulta externa.

Los cursores estticos de slo lectura son el nico tipo de cursor que se puede abrir en una instruccin SELECT cuya clusula FROM hace referencia a una funcin definida por el usuario que devuelve una tabla. Una instruccin SELECT que hace referencia a una funcin definida por el usuario que devuelve una table invoca la funcin una sola vez.Invocar funciones integradas con valores de tabla

Existen varias funciones integradas con valores de tabla que devuelven un valor de tabla. La invocacin de estas funciones integradas definidas por el usuario pueden estar no calificadas o utilizar el calificador de esquema sys. Debe utilizar el calificador de esquema sys para funciones integradas con valores de tabla, porque evita conflictos con funciones definidas por el usuario con el mismo nombre. En el siguiente ejemplo se muestra cmo invocar la funcin integrada del sistema fn_helpcollations.CopiarSELECT * FROM sys.fn_helpcollations(); GO

Usar sugerencias en funciones con valores de tabla

Al crear una funcin definida por el usuario, puede aplicar una sugerencia de tabla en las consultas que conforman la definicin de la funcin. Las sugerencias que se aplican a vistas que hacen referencia a funciones con valores de tabla de Transact-SQL tambin se aplican a las funciones. Estas funciones pueden entrar en conflicto con las sugerencias de la definicin de la funcin. Para obtener ms informacin, vea Resolucin de vistas. No puede aplicar sugerencias en vistas que hacen referencia a funciones con valores de tabla de CLR.Nota: La posibilidad de que el Database Engine (Motor de base de datos) aplique sugerencias de vistas a funciones con valores de tabla de mltiples instrucciones que forman parte de la definicin de vista se quitar en una versin futura de SQL Server.

No se puede aplicar una sugerencia de tabla al resultado de ninguna funcin con valores de tabla de la clusula FROM de una consulta.