Работа с определяемыми пользователем типами — обработка данных определяемого пользователем типа
Применимо к:SQL Server
Transact-SQL не предоставляет специализированный синтаксис для инструкций INSERT, UPDATE или DELETE при изменении данных в столбцах определяемого пользователем типа (UDT). Функции CAST и CONVERT Transact-SQL используются для приведения собственных типов данных к типу определяемого пользователем типа.
Вставка данных в столбец определяемого пользователем типа
Следующие инструкции Transact-SQL вставляют три строки примеров данных в таблицу Points . Тип данных Point состоит из целочисленных значений X и Y, которые предоставляются как свойства определяемого пользователем типа. Для приведения значений X и Y с разделителями-запятыми к типу 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
Для достижения одинаковых результатов можно также использовать функции CAST и CONVERT Transact-SQL.
SELECT ID, CAST(PointValue AS varchar)
FROM dbo.Points;
SELECT ID, CONVERT(varchar, PointValue)
FROM dbo.Points;
Точка определяемого пользователем типа предоставляет свои координаты 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 определяемого пользователем типа для переменной:
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 . Дополнительные сведения см. в разделе Создание типа User-Defined.
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. Списки кода, определяющие эти три метода, см. в разделе Кодирование типов User-Defined.
Следующая инструкция 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 .
Обновление данных в столбце определяемого пользователем типа
Чтобы обновить данные в столбце определяемого пользователем типа, используйте инструкцию 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 завершается ошибкой, так как нельзя использовать одно и то же имя столбца дважды в одной инструкции 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
Удаление данных из столбца определяемого пользователем типа
Чтобы удалить данные в определяемом пользователем режиме, используйте инструкцию 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
См. также:
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по