UDT 데이터 조작
Transact-SQL에서는 UDT(사용자 정의 형식) 열의 데이터를 수정할 때 INSERT, UPDATE 또는 DELETE 문에 대한 특별한 구문을 제공하지 않습니다. Transact-SQL CAST 또는 CONVERT 함수는 네이티브 데이터 형식을 UDT 형식으로 캐스트하는 데 사용됩니다.
UDT 열에 데이터 삽입
다음 Transact-SQL 문은 3개의 예제 데이터 행을 Points 테이블에 삽입합니다. Point 데이터 형식은 UDT 속성으로 노출되는 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 문은 UDT의 이진 값을 선택합니다.
SELECT ID, PointValue FROM dbo.Points
읽을 수 있는 형식으로 표시된 출력을 보려면 값을 해당 문자열 표현으로 변환하는 Point UDT의 ToString 메서드를 호출합니다.
SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points;
다음 결과가 생성됩니다.
IDPointValue
----------
13,4
21,5
31,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 속성은 결과 집합에 표시되는 정수 값을 반환합니다.
IDxValyVal
----------
134
215
3199
변수 작업
DECLARE 문에 변수를 사용하여 UDT 형식에 변수를 할당할 수 있습니다. 다음 문은 Transact-SQL SET 문을 사용하여 값을 할당하고 변수에서 UDT의 ToString 메서드를 호출하여 결과를 표시합니다.
DECLARE @PointValue 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 Point;
SELECT @PointValue = PointValue FROM dbo.Points
WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;
변수 할당에 SELECT 및 SET를 사용할 경우의 차이점은 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 Point;
SET @ComparePoint = CONVERT(Point, '3,4');
SELECT ID, PointValue.ToString() AS MatchingPoint
FROM dbo.Points
WHERE PointValue = @ComparePoint;
UDT 메서드 호출
Transact-SQL에서 UDT에 정의된 메서드를 호출할 수도 있습니다. Point 클래스에는 3개의 메서드(Distance, DistanceFrom 및 DistanceFromXY)가 포함되어 있습니다. 이러한 메서드 3개를 정의하는 코드 목록은 사용자 정의 형식 코딩을 참조하십시오.
다음 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
------------------------
1345
2155.09901951359278
319999.0050503762308
DistanceFrom 메서드는 Point 데이터 형식의 인수를 사용하고, 지정된 점에서 PointValue까지의 거리를 표시합니다.
SELECT ID, PointValue.ToString() AS Pnt,
PointValue.DistanceFrom(CONVERT(Point, '1,99')) AS DistanceFromPoint
FROM dbo.Points;
결과에 테이블의 각 행에 대한 DistanceFrom 메서드의 결과가 표시됩니다.
ID PntDistanceFromPoint
---------------------
13,495.0210502993942
21,594
31,990
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
바이트 순서를 true로 설정하여 UDT가 정의된 경우 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 어셈블리에 변경자(mutator) 메서드를 만들어야 합니다. 다음과 같이 변경자(mutator) 메서드를 호출하여 Transact-SQL UPDATE 문에서 개체를 업데이트할 수 있습니다.
UPDATE dbo.Points
SET PointValue.SetXY(5, 99)
WHERE ID = 3
UDT 열의 데이터 삭제
UDT의 데이터를 삭제하려면 Transact-SQL DELETE 문을 사용합니다. 다음 문은 WHERE 절에 지정된 조건과 일치하는 테이블의 모든 행을 삭제합니다. DELETE 문에서 WHERE 절을 생략하면 테이블의 모든 행이 삭제됩니다.
DELETE FROM dbo.Points
WHERE PointValue = CAST('1,99' AS Point)
다른 행 값은 그대로 두고 UDT 열의 값을 제거하려면 UPDATE 문을 사용합니다. 이 예에서는 PointValue를 null로 설정합니다.
UPDATE dbo.Points
SET PointValue = null
WHERE ID = 2