Работа с данными определяемого пользователем типа
В 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,421,531,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----------1342153199
Работа с переменными
Можно также работать с переменными при помощи инструкции 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.PointsWHERE PointValue > CONVERT(Point, '2,2');
Можно сравнить внутренние значения определяемого пользователем типа независимо от значения свойства IsByteOrdered, если значения сами по себе сравнимы. Следующая инструкция Transact-SQL выбирает строки, в которых X больше, чем Y:
SELECT ID, PointValue.ToString() AS PointValue FROM dbo.PointsWHERE PointValue.X < PointValue.Y;
Можно также использовать операторы сравнения с переменными, как показано в данном запросе, который ищет совпадения с PointValue.
DECLARE @ComparePoint Point;SET @ComparePoint = CONVERT(Point, '3,4');SELECT ID, PointValue.ToString() AS MatchingPoint FROM dbo.PointsWHERE 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------------------------13452155.09901951359278319999.0050503762308
Метод DistanceFrom принимает аргумент типа данных Point и отображает расстояние от указанной точки до PointValue:
SELECT ID, PointValue.ToString() AS Pnt, PointValue.DistanceFrom(CONVERT(Point, '1,99')) AS DistanceFromPointFROM dbo.Points;
The results отображают результаты работы метода DistanceFrom для каждой строки таблицы:
ID PntDistanceFromPoint---------------------13,495.021050299394221,59431,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.PointsSET PointValue = CAST('1,88' AS Point)WHERE ID = 3
Также можно обновлять элементы определяемого пользователем типа отдельно. Следующая инструкция Transact-SQL обновляет только координату Y:
UPDATE dbo.PointsSET PointValue.Y = 99WHERE ID = 3
Если определяемый пользователем тип был определен с упорядочением байтов, установленным в значение true, Transact-SQL может оценить столбец определяемого пользователем типа в предложении WHERE.
UPDATE dbo.PointsSET PointValue = '4,5'WHERE PointValue = '3,4';
Ограничения обновлений
Нельзя обновить несколько свойств за один раз при помощи Transact-SQL. Например, следующая инструкция UPDATE выполняется с ошибкой, так как нельзя использовать одно и то же имя столбца дважды в одной инструкции UDATE.
UPDATE dbo.PointsSET PointValue.X = 5, PointValue.Y = 99WHERE ID = 3
Для обновления каждой точки по отдельности необходимо создать метод мутатора в сборке определяемого пользователем типа Point. Можно затем обратиться к методу мутатора в инструкции Transact-SQL UPDATE для обновления объекта, как показано ниже:
UPDATE dbo.PointsSET PointValue.SetXY(5, 99)WHERE ID = 3
Удаление данных из столбца определяемого пользователем типа
Для удаления данных в определяемом пользователем типе используется инструкция Transact-SQL DELETE. Следующая инструкция удаляет все строки из таблицы, которые удовлетворяют критерию, который задан в предложении WHERE. Если предложение WHERE пропущено в инструкции DELETE, все строки таблицы будут удалены
DELETE FROM dbo.PointsWHERE PointValue = CAST('1,99' AS Point)
Инструкция UPDATE используется, если необходимо удалить значения в столбце определяемого пользователем типа и оставить другие значения строки без изменений. Этот пример выставляет PointValue в значение NULL.
UPDATE dbo.PointsSET PointValue = nullWHERE ID = 2