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