다음을 통해 공유


sql_variant(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

SQL Server에서 지원하는 여러 가지 데이터 형식의 값을 저장하는 데이터 형식입니다.

Transact-SQL 구문 표기 규칙

구문

sql_variant  

설명

sql_variant는 열, 매개 변수, 변수 및 사용자 정의 함수의 반환 값으로 사용될 수 있습니다. sql_variant는 이 데이터베이스 개체들이 다른 데이터 형식의 값을 지원할 수 있게 합니다.

sql_variant 형식의 열은 다른 데이터 형식의 행을 포함할 수 있습니다. 예를 들어 sql_variant로 정의된 열은 int, binarychar 값을 저장할 수 있습니다.

sql_variant는 최대 8016바이트의 길이를 가질 수 있습니다. 여기에는 기본 유형 정보 및 기본 유형 값이 모두 포함됩니다. 실제 기본 유형 값의 최대 길이는 8,000바이트입니다.

sql_variant 데이터 형식은 덧셈 및 뺄셈과 같은 연산에 사용되기 전에 먼저 기본 데이터 형식 값으로 캐스팅되어야 합니다.

sql_variant에 기본값을 할당할 수 있습니다. 이 데이터 형식은 NULL을 기초값으로 가질 수는 있지만 NULL 값은 연결된 기본 유형을 갖지 않습니다. 또한 sql_variant는 기본 유형으로 다른 sql_variant를 가질 수 없습니다.

고유 키, 기본 키 또는 외래 키는 sql_variant 형식의 열을 포함할 수 있지만 특정 행의 키를 구성하는 데이터 값의 총 길이는 인덱스의 최대 길이(900바이트)보다 크면 안 됩니다.

테이블은 sql_variant 열을 얼마든지 포함할 수 있습니다.

sql_variant를 CONTAINSTABLE 및 FREETEXTTABLE에 사용할 수 없습니다.

ODBC에서는 sql_variant를 모두 지원하지는 않습니다. 따라서 Microsoft OLE DB Provider for ODBC(MSDASQL)를 사용할 때 sql_variant 열을 쿼리하면 이진 데이터로 반환됩니다. 예를 들어 문자열 데이터 'PS2091'를 포함하는 sql_variant 열은 0x505332303931로 반환됩니다.

sql_variant 값 비교

sql_variant 데이터 형식은 변환을 위한 데이터 형식 계층 구조 목록의 맨 위에 속합니다. sql_variant 비교를 위해 SQL Server 데이터 형식 계층 구조 순서는 데이터 형식 패밀리로 그룹화됩니다.

데이터 형식 계층 데이터 형식 패밀리
sql_variant sql_variant
datetime2 날짜 및 시간
datetimeoffset 날짜 및 시간
datetime 날짜 및 시간
smalldatetime 날짜 및 시간
date 날짜 및 시간
time 날짜 및 시간
float 근사치
real 근사치
decimal 정확한 수치
money 정확한 수치
smallmoney 정확한 수치
bigint 정확한 수치
int 정확한 수치
smallint 정확한 수치
tinyint 정확한 수치
bit 정확한 수치
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary 이진
binary 이진
uniqueidentifier Uniqueidentifier

sql_variant 비교에는 다음 규칙이 적용됩니다.

  • 서로 다른 기본 데이터 형식의 sql_variant 값을 비교할 때 기본 데이터 형식이 서로 다른 데이터 형식 패밀리에 있으면 계층 구조 차트에서 더 높은 데이터 형식 패밀리의 값이 두 값 중 더 큰 것으로 간주됩니다.
  • 서로 다른 기본 데이터 형식의 sql_variant 값을 비교할 때 기본 데이터 형식이 동일한 데이터 형식 패밀리에 있으면 계층 구조 차트에서 더 낮은 기본 데이터 형식의 값이 암시적으로 다른 데이터 형식으로 변환된 다음, 비교됩니다.
  • char, varchar, nchar 또는 nvarchar 데이터 형식의 sql_variant 값을 비교하는 경우 해당 데이터 정렬은 먼저 LCID, LCID 버전, 비교 플래그 및 정렬 ID와 같은 기준에 따라 비교됩니다. 이러한 조건은 각각 정수 값으로, 그리고 나열된 순서대로 비교됩니다. 이러한 모든 조건이 같다면 실제 문자열 값은 데이터 정렬에 따라 비교됩니다.

sql_variant 데이터 변환

sql_variant 데이터 형식을 처리할 때 SQL Server은 개체의 데이터 형식을 sql_variant 형식으로 암시적으로 변환할 수 있습니다. 그러나 SQL Server은 sql_variant 데이터에서 다른 데이터 형식의 개체로의 암시 적 변환을 지원하지 않습니다.

제한

아래에는 sql_variant를 사용하여 저장할 수 없는 값 형식이 나열되어 있습니다.

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion(timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • 사용자 정의 형식
  • xml

1 SQL Server 2012 이상에서는 datetimeoffset을 제한하지 않습니다.

A. 테이블에서 sql_variant 사용

다음 예에서는 sql_variant 데이터 형식이 있는 테이블을 만듭니다. 그런 다음, 예제는 tableAsql_variantcolB 유형인 colA가 있는 경우 colB =1689colA46279.1에 대한 SQL_VARIANT_PROPERTY 정보를 검색합니다.

CREATE TABLE tableA(colA sql_variant, colB INT)  
INSERT INTO tableA values ( CAST(46279.1 as decimal(8,2)), 1689)  
SELECT   SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',  
         SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',  
         SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale'  
FROM      tableA  
WHERE     colB = 1689  

결과 집합은 다음과 같습니다. 이 세 값은 각각 sql_variant입니다.

Base Type    Precision    Scale  
---------    ---------    -----  
decimal      8           2  
  
(1 row(s) affected)  

B. 변수로 sql_variant 사용

다음 예제에서는 sql_variant 데이터 형식을 사용하여 변수를 만든 다음, @v1 변수에 대한 SQL_VARIANT_PROPERTY 정보를 검색합니다.

DECLARE @v1 sql_variant;  
SET @v1 = 'ABC';  
SELECT @v1;  
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');  
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');  

참고 항목

CAST 및 CONVERT(Transact-SQL)
SQL_VARIANT_PROPERTY(Transact-SQL)