Anda di halaman 1dari 8

Para crear un tipo de datos definido por el usuario

1. En el Explorador de objetos, expanda la opcin Base de datos, expanda


una base de datos, expanda Programabilidad, Tipos, haga clic con el
botn secundario en Tipos de datos definidos por el usuario y haga clic
en Nuevo tipo de datos definido por el usuario.
2. En el cuadro de dilogo Nuevo tipo de datos definido por el usuario, en
el cuadro Esquema, escriba el esquema al que pertenecer el tipo de datos
o utilice el botn de examinar para seleccionar un esquema.
3. En el cuadro Nombre, escriba el nombre para el nuevo tipo de datos.
4. En el cuadro Tipo de datos, seleccione el tipo de datos en el que se basar
el nuevo.
5. Rellene los cuadros Longitud, Precisin y Escala si corresponde para el
tipo de datos que est creando.
6. Active la casilla Permitir valores NULL si el nuevo tipo de datos puede
permitir valores NULL.
7. En el rea Enlace, cumplimente los cuadros Predeterminado o Regla si
desea enlazar un valor predeterminado o una regla al nuevo tipo de datos.
En SQL Server Management Studio no pueden crearse valores
predeterminados ni las reglas. Utilice Transact-SQL. El Explorador de
plantillas incluye cdigos de ejemplo para crear valores predeterminados y
reglas.

Cmo: Definir
expresiones de
restriccin CHECK
Visual Studio 2012

Otras versiones

Cuando se adjunta una restriccin CHECK a una tabla o columna, se debe incluir
una expresin Transact-SQL. Para obtener informacin detallada sobre esta
operacin, consulte Cmo: Asociar una nueva restriccin CHECK a una tabla o
columna.

Puede crear una expresin de restriccin sencilla para comprobar una condicin
sencilla en los datos o puede crear una expresin compleja mediante operadores
booleanos, para comprobar varias condiciones en los datos. Por ejemplo,
supongamos que la tabla authors tiene una columna zip que requiere una cadena
de caracteres de 5 dgitos. Esta expresin de restriccin de ejemplo garantiza que
slo se permitirn nmeros de 5 dgitos.

zip LIKE '[0-9][0-9][0-9][0-9][0-9]'


O supongamos que la tabla sales tiene una columna denominada qty que requiere
un valor mayor que 0. Esta restriccin de ejemplo garantiza que solo se permiten
valores positivos:

qty > 0

Nota

Algunas bases de datos tienen diferente funcionalidad para las restricciones


CHECK. Consulte la documentacin de la base de datos para obtener detalles sobre
cmo funciona la base de datos con restricciones CHECK.

Nota

Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de


los elementos de la interfaz de usuario de Visual Studio incluidos en las
instrucciones siguientes. La edicin de Visual Studio que se tenga y la configuracin
que se utilice determinan estos elementos. Para obtener ms informacin,
vea Valores de configuracin de Visual Studio.

Para definir una expresin de restriccin

1. Cree una restriccin CHECK nueva. Para obtener informacin detallada sobre
cmo hacerlo, consulte Cmo: Asociar una nueva restriccin CHECK a una
tabla o columna.

2. En el cuadro de dilogo Restricciones CHECK, escriba una expresin en el


cuadro de dilogo Expresin de restriccin CHECK utilizando la sintaxis
siguiente:

{constant
column_name
function
(subquery)}
[{operator
AND
OR
NOT}
{constant
column_name
function
(subquery)}]
Nota

Esta sintaxis es especfica de Microsoft SQL Server. Consulte la documentacin de


la base de datos para obtener ms detalles.

3. La sintaxis de Transact-SQL est formada por los siguientes parmetros:

Parmetro Descripcin

constant Valor literal, como un valor numrico o datos de caracteres. Los


datos de caracteres deben escribirse entre comillas sencillas (').

column_name Especifica una columna.

function Funcin integrada. Para ver ms detalles acerca de las funciones,


vea la documentacin de SQL Server.

operator Operador aritmtico, bit a bit, de comparacin o de cadena. Para


ver ms detalles acerca de los operadores, vea la documentacin de
SQL Server.

AND Se utiliza en expresiones booleanas para conectar dos


expresiones. Se devuelven resultados cuando las dos expresiones
son verdaderas.

Cuando se utilizan los operadores AND y OR en una instruccin, se


procesar primero el operador AND. Se puede cambiar el orden de
ejecucin mediante parntesis.

OR Se utiliza en expresiones booleanas para conectar dos o ms


condiciones. Se devuelven resultados cuando al menos una de las
condiciones sea verdadera.

Cuando se utilizan los operadores AND y OR en una instruccin,


OR se procesar despus que AND. Se puede cambiar el orden de
ejecucin mediante parntesis.

NOT Niega cualquier expresin booleana (que puede incluir palabras


clave como LIKE, NULL, BETWEEN, IN y EXISTS).

Cuando se utiliza ms de un operador lgico en una instruccin, se


procesar primero el operador NOT. Se puede cambiar el orden de
ejecucin mediante parntesis.

Crear funciones definidas por el usuario


(motor de base de datos)

En este tema se describe cmo crear una funcin definida por el usuario en SQL
Server con Transact-SQL.

Antes de comenzar
Limitaciones y restricciones

Las funciones definidas por el usuario no se pueden utilizar para realizar


acciones que modifican el estado de la base de datos.

Las funciones definidas por el usuario no pueden tener una clusula OUTPUT
INTO que tenga una tabla como destino.

Las funciones definidas por el usuario no pueden devolver varios conjuntos


de resultados. Utilice un procedimiento almacenado si necesita devolver
varios conjuntos de resultados.

El control de errores est restringido en una funcin definida por el usuario.


Una UDF no admite TRYCATCH, @ERROR o RAISERROR.
Las funciones definidas por el usuario no pueden llamar a un procedimiento
almacenado, pero pueden llamar a un procedimiento almacenado extendido.

Las funciones definidas por el usuario no pueden utilizar tablas temporales o


SQL dinmicas. Se permiten las variables de tabla.

Las instrucciones SET no se permiten en una funcin definida por el usuario.

No se admite la clusula FOR XML

Las funciones definidas por el usuario se pueden anidar; es decir, una


funcin definida por el usuario puede llamar a otra. El nivel de anidamiento
aumenta cuando se empieza a ejecutar la funcin llamada y disminuye
cuando se termina de ejecutar la funcin llamada. Las funciones definidas
por el usuario se pueden anidar hasta un mximo de 32 niveles. Si se
superan los niveles mximos de anidamiento, la cadena completa de
funciones de llamada produce un error. Cualquier referencia a cdigo
administrado desde una funcin Transact-SQL definida por el usuario cuenta
como uno de los 32 niveles de anidamiento. Los mtodos invocados desde el
cdigo administrado no cuentan para este lmite.

Las siguientes instrucciones de Service Broker no se pueden incluir en la


definicin de una funcin Transact-SQL definida por el usuario:

o EMPEZAR CONVERSACIN DE DILOGO

o FINALIZAR CONVERSACIN

o GET CONVERSATION GROUP

o MOVE CONVERSATION

o RECEIVE

o ENVIAR

Permisos

Se requiere el permiso CREATE FUNCTION en la base de datos y el permiso ALTER en


el esquema en el que se va a crear la funcin. Si la funcin especifica un tipo
definido por el usuario, requiere el permiso EXECUTE para ese tipo.

Funciones escalares
En el ejemplo siguiente se crea una funcin escalar de varias instrucciones en la
base de datos AdventureWorks2012 . La funcin toma un valor de
entrada, ProductID, y devuelve un valor de devolucin nico, la cantidad agregada
del producto especificado en el inventario.

IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') 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

En el ejemplo siguiente se utiliza la funcin ufnGetInventoryStock para devolver la


cantidad de inventario actual de aquellos productos que tienen
un ProductModelID entre 75 y 80.

SELECT ProductModelID, Name, dbo.ufnGetInventoryStock(ProductID)AS


CurrentSupply
FROM Production.Product
WHERE ProductModelID BETWEEN 75 and 80;

Funciones con valores de tabla


En el ejemplo siguiente se crea una funcin insertada con valores de tabla en la
base de datos AdventureWorks2012 . La funcin toma un parmetro de entrada, Id.
de cliente (almacn), y devuelve las columnas ProductID, Name, y el agregado de
las ventas del ao hasta la fecha como YTD Totalpara cada producto vendido en el
almacn.

IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') 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 '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
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
En el ejemplo siguiente se invoca la funcin y se especifica el identificador de
cliente 602.

SELECT * FROM Sales.ufn_SalesByStore (602);

En el ejemplo siguiente se crea una funcin con valores de tabla en la base de datos
AdventureWorks2012 . La funcin toma un nico parmetro de
entrada, EmployeeID , y devuelve una lista de todos los empleados que dependen
directa o indirectamente del empleado especificado. La funcin se invoca luego
especificando el empleado ID 109.

IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL


DROP FUNCTION dbo.ufn_FindReports;
GO
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
EmployeeID int primary key NOT NULL,
FirstName nvarchar(255) NOT NULL,
LastName nvarchar(255) NOT NULL,
JobTitle nvarchar(50) NOT NULL,
RecursionLevel int NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName,
JobTitle, RecursionLevel) -- CTE name and columns
AS (
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,
p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for
Manager n
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,
p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to
anchor
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) =
EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- copy the required columns to the result of the function
INSERT @retFindReports
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM EMP_cte
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM dbo.ufn_FindReports(1);

Anda mungkin juga menyukai