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

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

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

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

Получены следующие результаты.

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

Чтобы получить аналогичные результаты можно использовать функции Transact-SQL CAST и CONVERT.

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

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

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

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

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

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

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

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

DECLARE @PointValue 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 Point;
SELECT @PointValue = PointValue FROM dbo.Points
    WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;

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

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

Можно использовать операторы сравнения, чтобы сравнить значения в определяемом пользователем типе, если при определении класса для свойства 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 Point;
SET @ComparePoint = CONVERT(Point, '3,4');
SELECT ID, PointValue.ToString() AS MatchingPoint 
FROM dbo.Points
WHERE PointValue = @ComparePoint;

Вызов методов определяемого пользователем типа

Можно также вызывать методы, которые определены в определяемом пользователем типе Transact-SQL. Класс Point содержит три метода: Distance, DistanceFrom и DistanceFromXY. Листинги кода, определяющего эти три метода, см. в разделе Разработка кода для определяемых пользователем типов.

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

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

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

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

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

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

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

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

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

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

Результирующий набор аналогичен результату работы метода DistanceFrom.

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

Чтобы обновлять данные в столбце определяемого пользователем типа, используется инструкция 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 может оценить столбец определяемого пользователем типа в предложении WHERE.

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

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

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

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

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

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

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

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

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

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

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

См. также

Другие ресурсы

Работа с определяемыми пользователем типами в SQL Server