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

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

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

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

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

Точка 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 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.

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

Операторы сравнения можно использовать для сравнения значений в 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 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;  

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

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  

Если определяемый пользователем UDT с порядком байтов имеет значение 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. Затем можно вызвать метод мутатора для обновления объекта в инструкции Transact-SQL UPDATE, как показано ниже.

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

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

Чтобы удалить данные в UDT, используйте инструкцию 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