sql_variant 데이터 사용

sql_variant 데이터 형식의 작동 방식은 Microsoft Visual Basic 의 variant 데이터 형식과 유사합니다. sql_variant를 사용하면 단일 열, 매개 변수 또는 변수에 여러 데이터 형식의 데이터 값을 저장할 수 있습니다. 예를 들어 하나의 sql_variant 열에 int, decimal, char, binarynchar 값을 저장할 수 있습니다. 각 sql_variant 열에는 데이터 값과 메타데이터 정보가 기록됩니다. 여기에는 기본 데이터 형식, 최대 크기, 배율, 정밀도 및 데이터 정렬이 포함됩니다.

sql_variant 사용 규칙

다음 규칙은 sql_variant 데이터 형식을 사용할 때 적용됩니다.

일반 값 할당

  • sql_variant 개체는 text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml, timestamp 및 Microsoft .NET Framework CLR(공용 언어 런타임) 사용자 정의 형식을 제외한 모든 SQL Server 2005 데이터 형식의 데이터를 보유할 수 있습니다. 또한 sql_variant 데이터는 sql_variant를 기본 데이터 형식으로 사용할 수 없습니다.
  • sql_variant 열을 참조하는 조건자나 할당에는 모든 유형의 상수를 지정할 수 있습니다.
  • sql_variant 값이 NULL이면 기본 데이터 형식이 없는 것으로 간주됩니다. 이 규칙은 특정 데이터 형식의 열 또는 변수 값이 Null인 경우에도 적용됩니다.
    다음 예에서 VariantCol의 값은 int 변수의 값이 Null인 경우에도 연결된 데이터 형식 없이 NULL로 설정됩니다.
    DECLARE @IntVar int
    SET @IntVar = NULL
    UPDATE SomeTable SET VariantCol = @IntVar WHERE PriKey = 123
  • sql_variant 개체에서 다른 데이터 형식의 개체로 할당할 때는 sql_variant 값을 대상 데이터 형식으로 명시적으로 변환해야 합니다. 다른 데이터 형식의 개체에 sql_variant 값을 할당할 경우 암시적 변환이 지원되지 않습니다.
  • 다른 데이터 형식과의 호환성을 위해 sql_variant 개체의 길이를 보고하는 카탈로그 개체(예: DATALENGTH 함수)는 데이터 길이를 보고합니다. sql_variant 개체에 포함된 메타데이터의 길이는 반환되지 않습니다.
  • sql_variant 열은 ANSI_PADDING이 ON일 때 항상 작동합니다. ANSI_PADDING이 OFF인 원본에서 char, nchar, varchar, nvarchar 또는 varbinary 값이 할당되면 값이 채워지지 않습니다.

테이블의 sql_variant

  • 키 열에 있는 데이터의 길이가 900바이트 이하이면 인덱스와 고유 키에 sql_variant 열을 사용할 수 있습니다.
  • sql_variant 열은 IDENTITY 속성을 지원하지 않습니다. 그러나 기본 또는 외래 키의 일부로 sql_variant 열을 사용할 수 있습니다.
  • 계산 열에는 sql_variant 열을 사용할 수 없습니다.
  • ALTER TABLE을 사용하여 text, ntext, image, timestamp 또는 sql_variant를 제외한 모든 데이터 형식의 열을 sql_variant로 변경할 수 있습니다. 기존의 모든 값은 ALTER TABLE 문을 실행하기 전 열의 데이터 형식과 동일한 기본 데이터 형식의 sql_variant 값으로 변환됩니다. sql_variant에서 다른 데이터 형식으로의 암시적 변환이 지원되지 않으므로 ALTER TABLE을 사용하여 sql_variant 열의 데이터 형식을 다른 데이터 형식으로 변경할 수 없습니다.

데이터 정렬

  • COLLATE 절을 사용하여 열 데이터 정렬을 sql_variant 열에 할당할 수 없습니다. sql_variant 열의 문자 기반 값(char, nchar, varcharnvarchar)은 모든 데이터 정렬이 될 수 있고 단일 sql_variant 열은 혼합된 데이터 정렬의 문자 기반 값을 보유할 수 있습니다.
  • sql_variant 인스턴스에 값이 할당될 때 원본의 기본 데이터 형식과 데이터 값이 모두 할당됩니다. 원본 값에 데이터 정렬이 있으면 데이터 정렬도 할당됩니다. 원본 값에 사용자 정의 데이터 형식이 있으면 사용자 정의 데이터 형식의 기본 데이터 형식이 할당되고 사용자 정의 데이터 형식은 할당되지 않습니다. sql_variant 인스턴스는 사용자 정의 데이터 형식에 바인딩되어 있는 규칙이나 기본값을 상속하지 않습니다. IDENTITY 속성을 포함하는 열 값이 sql_variant 인스턴스에 할당되면 sql_variant는 원본 열의 기본 데이터 형식을 취하지만 IDENTITY 속성은 상속하지 않습니다. text, ntext 또는 image 값을 sql_variant 인스턴스에 할당하면 오류가 발생합니다. 암시적 변환은 값을 다른 데이터 형식의 개체 값을 sql_variant 개체에 할당할 때 지원됩니다.

sql_variant 비교

sql_variant 열에 기본 데이터 형식과 데이터 정렬 값이 여러 개 있을 수 있으므로 sql_variant 피연산자를 비교할 때 특별 규칙이 적용됩니다. 이러한 규칙은 다음과 같은 비교 관련 작업에 적용됩니다.

  • Transact-SQL 비교 연산자
  • ORDER BY, GROUP BY
  • 인덱스
  • MAX 및 MIN 집계 함수
  • UNION(ALL 없음)
  • CASE 식

sql_variant 비교를 위해 SQL Server 데이터 형식 계층 구조 순서는 데이터 형식 패밀리로 그룹화됩니다. sql_variant 패밀리의 우선 순위가 가장 높습니다.

데이터 형식 계층 데이터 형식 패밀리

sql_variant

sql_variant

datetime

날짜 및 시간

smalldatetime

날짜 및 시간

float

근사치

real

근사치

decimal

정확한 수치

money

정확한 수치

smallmoney

정확한 수치

bigint

정확한 수치

int

정확한 수치

smallint

정확한 수치

tinyint

정확한 수치

bit

정확한 수치

nvarchar

유니코드

nchar

유니코드

varchar

유니코드

char

유니코드

varbinary

이진

binary

이진

uniqueidentifier

Uniqueidentifier

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

  • 다른 기본 데이터 형식의 두 sql_variant 값을 비교할 때 기본 데이터 형식이 서로 다른 데이터 형식 패밀리에 속하면 계층 구조 차트에서 더 높은 데이터 형식 패밀리의 값이 더 높은 값으로 간주됩니다.
  • 다른 기본 데이터 형식의 두 sql_variant 값을 비교할 때 기본 데이터 형식이 동일한 데이터 형식 패밀리에 속하면 계층 구조 차트에서 더 낮은 기본 데이터 형식의 값이 암시적으로 다른 데이터 형식으로 변환된 후 비교됩니다.
  • char, varchar, nchar 또는 varchar 데이터 형식의 sql_variant 값을 비교할 때 LCID, LCID 버전, 비교 플래그 및 정렬 ID를 기준으로 평가됩니다. 이러한 각 조건은 나열된 순서에 따라 정수 값으로 비교됩니다.

이러한 규칙을 적용하면 sql_variant 값을 비교할 때와 동일한 기본 데이터 형식의 값을 비교할 때의 결과와 다를 수 있습니다.

피연산자 A 피연산자 B 비변형 비교 결과 sql_variant 비교 결과

'123' char

111 int

A > B

B > A

50000 int

5E1 float

A > B

B > A

다른 데이터 형식 패밀리의 값은 비교 조건자에서 참조되기 전에 명시적으로 형변환되어야 하므로 sql_variant 열에서 결과 집합의 순서를 지정할 때만 규칙의 효과가 있습니다. 다음 표의 값은 데이터 형식 선행 규칙의 예입니다.

PriKey VariantCol

1

50.0(기본 형식 float)

2

5000(기본 형식 int)

3

'124000'(기본 형식 char(6))

다음 표에서는 SELECT * FROM VariantTest ORDER BY VariantCol ASC 문의 결과를 보여 줍니다.

PriKey VariantCol

3

'124000'(기본 형식 char(6))

2

5000(기본 형식 int)

1

50.0(기본 형식 float)

다음 표의 값은 서로 다른 데이터 정렬을 사용하는 데이터 정렬 선행 규칙의 예입니다.

IntKey VariantCol

1

qrs(varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

2

abc(varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

3

qrs(varchar SQL_Latin1_General_CP1_CS_AS)

4

17.5(십진수)

5

abc(varchar SQL_Latin1_General_CP1_CS_AS)

6

klm(varchar SQL_Latin1_General_CP1_CS_AS)

7

1.2(십진수)

다음 표에서는 SELECT * FROM CollateTest ORDER BY VariantCol 문의 결과를 보여 줍니다. 이 표에서는 함께 그룹화된 정확한 number 데이터 형식 패밀리의 값과 각 데이터 정렬 내에 그룹화된 varchar 값을 보여 줍니다.

IntKey VariantCol

5

abc(varchar SQL_Latin1_General_CP1_CS_AS)

6

klm(varchar SQL_Latin1_General_CP1_CS_AS)

3

qrs(varchar SQL_Latin1_General_CP1_CS_AS)

2

abc(varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

1

qrs(varchar SQL_Latin1_General_Pref_Cp1_CI_AS)

7

1.2(십진수)

4

17.5(십진수)

함수 및 sql_variant 데이터

다음 Transact-SQL 함수는 sql_variant 매개 변수를 지원하며 sql_variant 매개 변수 지정 시 sql_variant 값을 반환합니다.

COALESCE

MIN

MAX

NULLIF

다음 함수는 sql_variant 열이나 변수에 대한 참조를 지원하고 sql_variant를 반환 값의 데이터 형식으로 사용하지 않습니다.

COL_LENGTH

DATALENGTH

TYPEPROPERTY

COLUMNPROPERTY

ISNULL

 

다음 Transact-SQL 함수는 sql_variant 매개 변수를 지원하지 않습니다.

AVG

RADIANS

STDEV[P]

IDENTITY

ROUND

SUM

ISNUMERIC

SIGN

VAR[P]

POWER

 

 

CAST 및 CONVERT 함수는 sql_variant를 지원합니다.

새 SQL_VARIANT_PROPERTY() 함수를 사용하여 데이터 형식, 정밀도, 배율 등의 sql_variant 값에 대한 속성 정보를 얻을 수 있습니다.

기타 Transact-SQL 요소 및 sql_variant 데이터

sql_variant 열은 LIKE 조건자에서 지원되지 않습니다.

sql_variant 열은 전체 텍스트 인덱스에서 지원되지 않습니다. sql_variant 열은 CONTAINSTABLE 및 FREETEXTTABLE 등의 전체 텍스트 함수에 지정할 수 없습니다.

다음 Transact-SQL 문을 사용하면 다른 integer 데이터 형식과 동일한 구문 위치에 sql_variant를 지정할 수 있습니다.

  • ALTER PROCEDURE
  • ALTER TABLE
  • CREATE PROCEDURE
  • CREATE TABLE
  • DECLARE variable

SQL Server 2005 카탈로그 구성 요소는 sql_variant 열에 대한 정보를 보고합니다.

입력 식이나 결과 식 중 하나가 sql_variant로 평가되면 CASE 식의 결과는 sql_variant가 됩니다. 결과의 기본 형식은 런타임에 결과로 평가되는 식의 형식입니다.

숫자 또는 문자열 연결 연산자의 피연산자는 sql_variant가 될 수 없습니다. 예를 들어 다음 코드는 오류를 생성합니다.

SELECT VariantCol + @CharacterVar

FROM MyTable

그러나 sql_variant 피연산자를 형변환하여 다음 작업을 수행할 수 있습니다.

SELECT CAST(VariantCol AS varchar(25)) + @CharacterVar

FROM MyTable

응용 프로그램 및 sql_variant 데이터

응용 프로그램에서 특정 열이 단일 기본 데이터 형식의 sql_variant 데이터를 반환하는 결과 집합을 요청하면 응용 프로그램은 Transact-SQL 문의 CAST 또는 CONVERT 함수를 통해 기본 데이터 형식을 사용하여 sql_variant 데이터를 반환할 수 있습니다. 이 경우 응용 프로그램은 기본 데이터 형식의 결과 집합 열과 동일한 방법으로 데이터를 처리합니다.

SQL Server 용 SQL 네이티브 클라이언트 OLE DB 공급자에는 sql_variant 열 및 매개 변수와 함께 사용할 수 있는 공급자별 OLE DB 형식인 DBTYPE_SQLVARIANT가 도입되었습니다.

SQL Server SQL 네이티브 클라이언트 ODBC 드라이버에는 sql_variant 열 및 매개 변수와 함께 사용할 수 있는 공급자별 ODBC 데이터베이스 데이터 형식인 SQL_SS_VARIANT가 도입되었습니다.

SQL Server 에서 다음 인터페이스를 사용하여 연결된 응용 프로그램으로 작업할 때 sql_variant 값이 **nvarchar(4000)**으로 변환됩니다.

  • SQL Server 버전 7.0용 OLE DB 공급자
  • SQL Server 7.0의 SQL Server ODBC 드라이버

결과 문자열이 4,000자를 초과하는 경우 SQL Server 에서는 처음 4,000자만 반환됩니다.

SQL Server 에서 다음 인터페이스를 사용하여 연결된 응용 프로그램으로 작업할 때 sql_variant 값이 **varchar(255)**로 변환됩니다.

  • SQL Server 6.5 또는 이전 버전의 SQL Server ODBC 드라이버

결과 문자열이 255자를 초과하는 경우 SQL Server 에서는 처음 255자만 반환됩니다.

참고 항목

관련 자료

CAST 및 CONVERT(Transact-SQL)
sql_variant(Transact-SQL)
SQL_VARIANT_PROPERTY(Transact-SQL)
데이터 형식(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기