Manipular datos UDT

Transact-SQL no proporciona ninguna sintaxis especializada para las instrucciones INSERT, UPDATE o DELETE al modificar datos en columnas de tipo definido por el usuario (UDT). Para convertir los tipos de datos nativos al tipo UDT, se utilizan las funciones CAST o CONVERT de Transact-SQL.

Insertar datos en una columna UDT

Las siguientes instrucciones de Transact-SQL insertan tres filas de datos de ejemplo en la tabla Points. El tipo de datos Point está compuesto por valores enteros X e Y que se exponen como propiedades del UDT. Debe utilizar las funciones CAST o CONVERT para convertir los valores X e Y separados por comas al tipo Point. Las dos primeras instrucciones utilizan la función CONVERT para convertir un valor de cadena al tipo Point y la tercera utiliza la función CAST:

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));

Seleccionar datos

La siguiente instrucción SELECT selecciona el valor binario del UDT.

SELECT ID, PointValue FROM dbo.Points

Para ver la salida mostrada en un formato legible, llame al método ToString del UDTPoint, que convierte el valor a su representación de cadena.

SELECT ID, PointValue.ToString() AS PointValue 
FROM dbo.Points;

Esto produce el siguiente resultado.

IDPointValue
----------
13,4
21,5
31,99

También puede utilizar las funciones CAST y CONVERT de Transact-SQL para lograr los mismos resultados.

SELECT ID, CAST(PointValue AS varchar) 
FROM dbo.Points;

SELECT ID, CONVERT(varchar, PointValue) 
FROM dbo.Points;

El UDT Point expone sus coordenadas X e Y como propiedades, que posteriormente puede seleccionar de forma individual. La siguiente instrucción Transact-SQL selecciona las coordenadas X e Y por separado:

SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal 
FROM dbo.Points;

Las propiedades X e Y devuelven un valor entero, que se muestra en el conjunto de resultados.

IDxValyVal
----------
134
215
3199

Trabajar con variables

Puede trabajar con variables si utiliza la instrucción DECLARE para asignar una variable a un tipo UDT. Las instrucciones siguientes asignan un valor mediante la instrucción SET de Transact-SQL y muestran los resultados con una llamada al método ToString del UDT en la variable:

DECLARE @PointValue Point;
SET @PointValue = (SELECT PointValue FROM dbo.Points
    WHERE ID = 2);
SELECT @PointValue.ToString() AS PointValue;

El conjunto de resultados muestra el valor variable:

PointValue
----------
-1,5

Las siguientes instrucciones Transact-SQL logran el mismo resultado utilizando SELECT en lugar de SET para la asignación de variable:

DECLARE @PointValue Point;
SELECT @PointValue = PointValue FROM dbo.Points
    WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;

La diferencia entre el uso de SELECT y SET para la asignación de variable es que SELECT permite asignar varias variables en una instrucción SELECT, mientras que la sintaxis de SET exige que cada asignación de variable tenga su propia instrucción SET.

Comparar datos

Puede utilizar operadores de comparación para comparar valores del UDT si ha establecido la propiedad IsByteOrdered en true al definir la clase. Para obtener más información, vea Crear un tipo definido por el usuario.

SELECT ID, PointValue.ToString() AS Points 
FROM dbo.Points
WHERE PointValue > CONVERT(Point, '2,2');

Puede comparar valores internos del UDT sin tener en cuenta el valor IsByteOrdered si los propios valores son comparables. La siguiente instrucción Transact-SQL selecciona filas donde X es mayor que Y:

SELECT ID, PointValue.ToString() AS PointValue 
FROM dbo.Points
WHERE PointValue.X < PointValue.Y;

También puede utilizar operadores de comparación con variables, tal como se muestra en esta consulta que busca un PointValue correspondiente.

DECLARE @ComparePoint Point;
SET @ComparePoint = CONVERT(Point, '3,4');
SELECT ID, PointValue.ToString() AS MatchingPoint 
FROM dbo.Points
WHERE PointValue = @ComparePoint;

Invocar métodos del UDT

También puede invocar métodos que se definen en el UDT en Transact-SQL. La clase Point contiene tres métodos, Distance, DistanceFrom y DistanceFromXY. Para obtener las listas de código que definen estos tres métodos, vea Codificar tipos definidos por el usuario.

La siguiente instrucción Transact-SQL llama al método PointValue.Distance:

SELECT ID, PointValue.X AS [Point.X], 
    PointValue.Y AS [Point.Y],
    PointValue.Distance() AS DistanceFromZero 
FROM dbo.Points;

Los resultados se muestran en la columna Distance:

IDXYDistance
------------------------
1345
2155.09901951359278
319999.0050503762308

El método DistanceFrom toma un argumento del tipo de datos Point y muestra la distancia desde el punto especificado hasta PointValue:

SELECT ID, PointValue.ToString() AS Pnt,
   PointValue.DistanceFrom(CONVERT(Point, '1,99')) AS DistanceFromPoint
FROM dbo.Points;

La salida muestra los resultados del método DistanceFrom en cada fila de la tabla:

ID PntDistanceFromPoint
---------------------
13,495.0210502993942
21,594
31,990

El método DistanceFromXY toma los puntos de forma individual como argumentos:

SELECT ID, PointValue.X as X, PointValue.Y as Y, 
PointValue.DistanceFromXY(1, 99) AS DistanceFromXY 
FROM dbo.Points

El conjunto de resultados es el mismo que en el método DistanceFrom.

Actualizar datos en una columna UDT

Para actualizar datos en una columna UDT, utilice la instrucción UPDATE de Transact-SQL. También puede utilizar un método del UDT para actualizar el estado del objeto. La siguiente instrucción Transact-SQL actualiza una única fila en la tabla:

UPDATE dbo.Points
SET PointValue = CAST('1,88' AS Point)
WHERE ID = 3

También puede actualizar los elementos UDT por separado. La siguiente instrucción Transact-SQL sólo actualiza la coordenada Y:

UPDATE dbo.Points
SET PointValue.Y = 99
WHERE ID = 3

Si el UDT se ha definido con el orden de bytes establecido en true, Transact-SQL puede evaluar la columna UDT en una cláusula WHERE.

UPDATE dbo.Points
SET PointValue = '4,5'
WHERE PointValue = '3,4';

Limitaciones de la actualización

No puede actualizar varias propiedades a la vez mediante Transact-SQL. Por ejemplo, la siguiente instrucción UPDATE genera un error porque no puede utilizar dos veces el mismo nombre de columna en una instrucción UPDATE.

UPDATE dbo.Points
SET PointValue.X = 5, PointValue.Y = 99
WHERE ID = 3

Para actualizar individualmente cada punto, debe crear un método mutador en el ensamblado UDT de Point. A continuación, puede invocar el método mutador para actualizar el objeto en una instrucción UPDATE de Transact-SQL, como en el siguiente ejemplo:

UPDATE dbo.Points
SET PointValue.SetXY(5, 99)
WHERE ID = 3

Eliminar datos en una columna UDT

Para eliminar datos en un UDT, utilice la instrucción DELETE de Transact-SQL. La siguiente instrucción elimina todas las filas de la tabla que coinciden con los criterios especificadas en la cláusula WHERE. Si omite la cláusula WHERE de una instrucción DELETE, se eliminarán todas las filas de la tabla.

DELETE FROM dbo.Points
WHERE PointValue = CAST('1,99' AS Point)

Utilice la instrucción UPDATE si desea quitar los valores de una columna UDT y conservar los valores de otra fila intactos. En este ejemplo se establece PointValue en NULL.

UPDATE dbo.Points
SET PointValue = null
WHERE ID = 2