Поделиться через


Управление данными определяемого пользователем типа (UDT)

Область применения:SQL Server

Transact-SQL не предоставляет специализированный синтаксис для INSERT, UPDATEили DELETE инструкций при изменении данных в столбцах определяемого пользователем типа (UDT). Функции Transact-SQL CAST или CONVERT используются для приведения собственных типов данных к типу определяемого пользователем типа.

Вставка данных в столбец определяемого пользователем типа

Следующие инструкции Transact-SQL вставляют три строки примеров данных в таблицу Points. Тип данных Point состоит из целочисленных значений X и Y, предоставляемых как свойства определяемого пользователем типа. Для Point типа Point необходимо использовать функцию CAST или CONVERT. Первые две инструкции используют функцию CONVERT для преобразования строкового значения в тип Point, а третья инструкция использует функцию 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));

Выбор данных

Следующая инструкция SELECT выбирает двоичное значение определяемого пользователем типа.

SELECT ID, PointValue
FROM dbo.Points;

Чтобы просмотреть выходные данные, отображаемые в удобочитаемом формате, вызовите метод ToString определяемого пользователем типа Point, который преобразует значение в его строковое представление.

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

Вот результирующий набор.

ID PointValue
-- ----------
 1 3,4
 2 1,5
 3 1,99

Вы также можете использовать функции Transact-SQL CAST и CONVERT для достижения одинаковых результатов.

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

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

Point UDT предоставляет свои координаты X и Y в виде свойств, которые затем можно выбрать по отдельности. Следующая инструкция Transact-SQL выбирает координаты X и Y отдельно:

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

Свойства X и Y возвращают целочисленные значения, которые отображаются в результирующем наборе.

ID xVal yVal
-- ---- ----
 1    3    4
 2    1    5
 3    1   99

Работа с переменными

Вы можете работать с переменными с помощью инструкции DECLARE, чтобы назначить переменную типу определяемого пользователем типа. Следующие инструкции назначают значение с помощью инструкции Transact-SQL SET и отображают результаты путем вызова метода ToString UDT в переменной:

DECLARE @PointValue AS Point;

SET @PointValue = (SELECT PointValue
                   FROM dbo.Points
                   WHERE ID = 2);

SELECT @PointValue.ToString() AS PointValue;

Результирующий набор отображает значение переменной:

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

Следующие операторы Transact-SQL обеспечивают тот же результат, что и SELECT, а не SET для назначения переменной:

DECLARE @PointValue AS Point;

SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;

SELECT @PointValue.ToString() AS PointValue;

Разница между использованием SELECT и SET для назначения переменных заключается в том, что SELECT позволяет назначать несколько переменных в одной инструкции SELECT, в то время как синтаксис SET требует, чтобы каждое назначение переменной было собственным оператором SET.

Сравнение данных

Операторы сравнения можно использовать для сравнения значений в UDT, если при определении класса IsByteOrdered свойство true. Дополнительные сведения см. в статье Создание пользовательских типов.

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

Внутренние значения определяемого пользователем значения можно сравнить независимо от параметра IsByteOrdered, если сами значения сопоставимы. Следующая инструкция Transact-SQL выбирает строки, в которых X больше Y:

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

Вы также можете использовать операторы сравнения с переменными, как показано в этом запросе, который ищет соответствующий PointValue.

DECLARE @ComparePoint AS Point;
SET @ComparePoint = CONVERT (Point, '3,4');

SELECT ID, PointValue.ToString() AS MatchingPoint
FROM dbo.Points
WHERE PointValue = @ComparePoint;

Вызов методов UDT

Вы также можете вызывать методы, определенные в определяемом пользователем пакете в Transact-SQL. Класс Point содержит три метода, Distance, DistanceFromи DistanceFromXY. Список кода, определяющих эти три метода, см. в разделе Создание определяемых пользователем типов с помощью ADO.NET.

Следующая инструкция Transact-SQL вызывает метод PointValue.Distance:

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

Результаты отображаются в столбце Distance:

ID X  Y  Distance
-- -- -- ----------------
 1  3  4                5
 2  1  5 5.09901951359278
 3  1 99 99.0050503762308

Метод DistanceFrom принимает аргумент типа данных Point и отображает расстояние от указанной точки до PointValue:

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

Результаты отображают результаты метода DistanceFrom для каждой строки в таблице:

ID Pnt DistanceFromPoint
-- --- -----------------
 1 3,4  95.0210502993942
 2 1,5                94
 3 1,9                90

Метод DistanceFromXY по отдельности принимает точки в качестве аргументов:

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

Результирующий набор совпадает с методом DistanceFrom.

Обновление данных в столбце определяемого пользователем типа

Чтобы обновить данные в столбце UDT, используйте инструкцию Transact-SQL UPDATE. Также можно использовать метод определяемого пользователем типа, чтобы обновить состояние объекта. Следующая инструкция Transact-SQL обновляет одну строку в таблице:

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

Также можно обновлять элементы определяемого пользователем типа отдельно. Следующая инструкция Transact-SQL обновляет только координату Y:

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

Если определяемый пользователем объект с порядком байтов имеет значение true, Transact-SQL может оценить столбец UDT в предложении WHERE.

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

Ограничения обновления

Вы не можете одновременно обновлять несколько свойств с помощью Transact-SQL. Например, следующая инструкция UPDATE завершается ошибкой, так как нельзя использовать одно и то же имя столбца дважды в одной инструкции UPDATE.

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

Чтобы обновить каждую точку по отдельности, необходимо создать метод мутатора в Point сборке UDT. Затем можно вызвать метод мутатора для обновления объекта в инструкции Transact-SQL UPDATE, как показано в следующем примере:

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

Удаление данных в столбце определяемого пользователем типа

Чтобы удалить данные в определяемом пользователем режиме, используйте инструкцию Transact-SQL DELETE. Следующая инструкция удаляет все строки в таблице, соответствующие условиям, указанным в предложении WHERE. Если в инструкции DELETE опущено предложение WHERE, все строки в таблице удаляются.

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

Используйте инструкцию UPDATE, если вы хотите удалить значения в столбце UDT при сохранении других значений строк. В этом примере PointValue имеет значение NULL.

UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;