다음을 통해 공유


UDT(사용자 정의 형식) 데이터 조작

적용 대상:SQL Server

Transact-SQL UDT(사용자 정의 형식) 열에서 데이터를 수정할 때 INSERT, UPDATE또는 DELETE 문에 대한 특수 구문을 제공하지 않습니다. Transact-SQL CAST 또는 CONVERT 함수는 네이티브 데이터 형식을 UDT 형식으로 캐스팅하는 데 사용됩니다.

UDT 열에 데이터 삽입

다음 Transact-SQL 문은 세 행의 샘플 데이터를 Points 테이블에 삽입합니다. Point 데이터 형식은 UDT의 속성으로 노출되는 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 문은 UDT의 이진 값을 선택합니다.

SELECT ID, PointValue
FROM dbo.Points;

읽을 수 있는 형식으로 표시되는 출력을 보려면 값을 문자열 표현으로 변환하는 Point UDT의 ToString 메서드를 호출합니다.

SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points;

결과 집합은 다음과 같습니다.

ID PointValue
-- ----------
 1 3,4
 2 1,5
 3 1,99

Transact-SQL CASTCONVERT 함수를 사용하여 동일한 결과를 얻을 수도 있습니다.

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 문을 사용하여 변수를 사용하여 UDT 형식에 변수를 할당할 수 있습니다. 다음 문은 Transact-SQL SET 문을 사용하여 값을 할당하고 변수에서 UDT의 ToString 메서드를 호출하여 결과를 표시합니다.

DECLARE @PointValue AS Point;

SET @PointValue = (SELECT PointValue
                   FROM dbo.Points
                   WHERE ID = 2);

SELECT @PointValue.ToString() AS PointValue;

결과 집합에 변수 값이 표시됩니다.

PointValue
----------
-1,5

다음 Transact-SQL 문은 변수 할당에 대해 SET 대신 SELECT 사용하여 동일한 결과를 달성합니다.

DECLARE @PointValue AS Point;

SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;

SELECT @PointValue.ToString() AS PointValue;

변수 할당에 SELECTSET 사용하는 경우의 차이점은 SELECT 하나의 SELECT 문에서 여러 변수를 할당할 수 있는 반면, SET 구문에는 각 변수 할당에 고유한 SET 문이 있어야 한다는 점입니다.

데이터 비교

클래스를 정의할 때 IsByteOrdered 속성을 true 설정하면 비교 연산자를 사용하여 UDT의 값을 비교할 수 있습니다. 자세한 내용은 사용자 정의 형식 만들기를 참조하세요.

SELECT ID, PointValue.ToString() AS Points
FROM dbo.Points
WHERE PointValue > CONVERT (Point, '2,2');

값 자체가 비교할 수 있는 경우 IsByteOrdered 설정에 관계없이 UDT의 내부 값을 비교할 수 있습니다. 다음 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의 UDT에 정의된 메서드를 호출할 수도 있습니다. Point 클래스에는 Distance, DistanceFromDistanceFromXY세 가지 메서드가 포함되어 있습니다. 이러한 세 가지 메서드를 정의하는 코드 목록은 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 열의 데이터 업데이트

UDT 열의 데이터를 업데이트하려면 Transact-SQL UPDATE 문을 사용합니다. UDT의 메서드를 사용하여 개체 상태를 업데이트할 수도 있습니다. 다음 Transact-SQL 문은 테이블의 단일 행을 업데이트합니다.

UPDATE dbo.Points
SET PointValue = CAST ('1,88' AS Point)
WHERE ID = 3;

UDT 요소를 별도로 업데이트할 수도 있습니다. 다음 Transact-SQL 문은 Y 좌표만 업데이트합니다.

UPDATE dbo.Points
SET PointValue.Y = 99
WHERE ID = 3;

UDT가 true바이트 순서로 설정된 경우 Transact-SQL WHERE 절에서 UDT 열을 평가할 수 있습니다.

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;

UDT 열에서 데이터 삭제

UDT에서 데이터를 삭제하려면 Transact-SQL DELETE 문을 사용합니다. 다음 문은 WHERE 절에 지정된 조건과 일치하는 테이블의 모든 행을 삭제합니다. DELETE 문에서 WHERE 절을 생략하면 테이블의 모든 행이 삭제됩니다.

DELETE dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);

다른 행 값을 그대로 유지하면서 UDT 열의 값을 제거하려면 UPDATE 문을 사용합니다. 다음은 PointValue null로 설정하는 예제입니다.

UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;