적용 대상: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 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 문을 사용하여 변수를 사용하여 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, 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 열의 데이터 업데이트
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;
관련 콘텐츠
- SQL Server 사용자 정의 형식으로 작업