Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Область применения: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;