특수 데이터 형식 사용

이 항목에서는 SQL Server에서 사용할 수 있는 특수 데이터 형식에 대해 설명합니다. 특수 데이터 형식은 다른 어떤 데이터 형식 범주에도 속하지 않는 데이터 형식입니다. SQL Server에서 특수 데이터 형식에는 bit, hierarchyid, sql_variant, sysname, table, timestamp 및 별칭 데이터 형식이 있습니다.

bit

bit 데이터 형식은 0 또는 1을 저장하는 숫자 데이터 형식입니다. 문자열 값 true 및 false는 다음 예에서와 같이 bit 값으로 변환할 수 있습니다.

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

이 예에서 true는 1로 변환되고 false는 0으로 변환됩니다. bit 데이터는 작은따옴표로 묶지 않아도 됩니다.

hierarchyid

hierarchyid 데이터 형식은 계층적 데이터 및 계층적 구조를 갖는 테이블을 관리하는 데 사용됩니다. Transact-SQL 코드에서 계층적 데이터를 사용하려면 hierarchyid 함수를 사용합니다. 자세한 내용은 hierarchyid 데이터 형식 사용(데이터베이스 엔진)을 참조하십시오.

sql_variant

sql_variant 데이터 형식은 단일 열, 매개 변수 또는 변수를 사용하여 여러 데이터 형식의 데이터 값을 저장합니다. sql_variant 열의 각 인스턴스는 값과 이러한 값을 설명하는 메타 데이터를 기록합니다. 다음 메타 데이터를 사용할 수 있습니다.

  • 기본 데이터 형식

  • 최대 크기

  • 소수 자릿수

  • 정확성

  • 데이터 정렬

특정 sql_variant 인스턴스에 대한 메타데이터를 검색하려면 SQL_VARIANT_PROPERTY 함수를 사용합니다.

다음 예의 두 번째 테이블에는 sql_variant 열이 있습니다.

CREATE TABLE ObjectTable (
   ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY,
   ObjectName nvarchar(80),
   ObjectWeight decimal(10,3),
   ObjectColor nvarchar(20))
CREATE TABLE VariablePropertyTable (
   ObjectID int REFERENCES ObjectTable(ObjectID),
   PropertyName nvarchar(100),
   PropertyValue sql_variant,
   CONSTRAINT PKVariablePropertyTable
   PRIMARY KEY(ObjectID, PropertyName))

sysname

sysname 데이터 형식은 개체 이름을 저장하는 테이블 열, 변수 및 저장 프로시저 매개 변수에 사용됩니다. sysname의 정확한 정의는 식별자 규칙과 관련이 있으므로 SQL Server 인스턴스마다 다를 수 있습니다. sysname은 기능적으로 nvarchar(128)와 동일하지만 sysname의 기본값은 NOT NULL이라는 차이점이 있습니다. 이전 버전의 SQL Server에서 sysname은 varchar(30)로 정의됩니다.

중요 정보중요

대/소문자를 구분하거나 이진 데이터 정렬을 사용하는 데이터베이스에서 sysname은 소문자로 나타나는 경우에만 SQL Server 시스템 데이터 형식으로 인식됩니다.

table

table 데이터 형식은 임시 테이블과 같은 기능을 합니다. 이 데이터 형식은 나중에 처리하기 위해 결과 집합을 저장하는 데 사용됩니다. 이 데이터 형식은 table 형식의 지역 변수와 사용자 정의 함수의 반환 값을 정의하는 데만 사용될 수 있습니다.

테이블 변수나 반환 값의 정의에는 열, 데이터 형식, 전체 자릿수, 각 열의 소수 자릿수, 선택적인 PRIMARY KEY, UNIQUE, NULL 및 CHECK 제약 조건의 정의가 포함됩니다. 사용자 정의 테이블은 데이터 형식으로 사용할 수 없습니다.

변수를 선언하거나 함수를 만드는 경우 table 변수에 저장되는 행이나 사용자 정의 함수에서 반환되는 행의 형식을 정의해야 합니다. 구문은 CREATE TABLE 구문에 기반을 둡니다. 예를 들어 다음과 같습니다.

DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3))
INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')
SELECT * FROM @TableVar
GO

table을 반환하는 사용자 정의 함수와 table 변수는 UPDATE, DELETE 및 DECLARE CURSOR 문에서 테이블이 지원되는 경우 특정 SELECT 및 INSERT 문에서만 사용할 수 있습니다. table을 반환하는 사용자 정의 함수와 table 변수는 다른 Transact-SQL 문에서 사용할 수 없습니다.

테이블에 적용되는 인덱스나 다른 제약 조건을 DECLARE 변수나 CREATE FUNCTION 문의 일부로 정의해야 합니다. CREATE INDEX 또는 ALTER TABLE 문은 테이블 변수와 사용자 정의 함수를 참조할 수 없으므로 나중에 적용할 수 없습니다.

table 변수 및 사용자 정의 함수를 정의하는 데 사용되는 구문에 대한 자세한 내용은 DECLARE @local_variable(Transact-SQL)CREATE FUNCTION(Transact-SQL)을 참조하십시오.

timestamp

timestamp 데이터 형식은 시간 또는 날짜와 아무런 관련이 없습니다. timestamp 값은 데이터베이스에서 데이터가 수정된 상대적 순서를 나타내는 이진수입니다.

timestamp 값은 행이 수정될 때마다 변경되므로 키, 특히 기본 키에는 timestamp 열을 사용해서는 안 됩니다.

테이블에서 데이터가 수정된 횟수를 기록하려면 datetime2 또는 smalldatetime 데이터 형식으로 이벤트와 트리거를 기록하여 수정된 내용이 있을 때마다 자동으로 값을 업데이트합니다.

별칭 데이터 형식

별칭 데이터 형식을 사용하면 설명이 포함된 이름 및 형식을 특정 용도에 맞게 사용자 지정하여 SQL Server 기본 데이터 형식(예: varchar)에 추가함으로써 이러한 데이터 형식을 확장할 수 있습니다. 예를 들어 다음 문에서는 datetime 데이터 형식에 기반을 두고 있고 Null 값(NULL)을 허용하는 birthday 사용자 정의 데이터 형식을 구현합니다.

EXEC sp_addtype birthday, datetime, 'NULL'

사용자 정의 데이터 형식을 구현하기 위해 기본 형식을 선택할 때는 주의하십시오. 예를 들어 미국 사회 보장 번호는 nnn-nn-nnnn 형식입니다. 사회 보장 번호에 숫자가 포함되어 있지만 이 숫자는 식별자를 형성하며 수치 연산이 적용되지 않습니다. 그러므로 다음 예에서와 같이 사용자 정의 사회 보장 번호 데이터 형식을 varchar로 만들고 CHECK 제약 조건을 만들어 테이블에 저장된 사회 보장 번호의 형식을 적용하는 것이 일반적입니다.

EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL'
GO
CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' )
)
GO

일반적으로 SSN 열이 인덱스, 특히 클러스터형 인덱스의 키 열로 사용되는 경우 대신 int 기본 데이터 형식을 사용하여 SSN 사용자 정의 데이터 형식을 구현하면 키의 크기를 11바이트에서 4바이트로 줄일 수 있습니다. 키 크기가 이렇게 감소하면 데이터 검색이 향상됩니다. SSN 값을 표시하거나 수정할 때 int에서 문자 형식으로 변환해야 하지만 데이터 검색의 효율성이 향상되고 CHECK 제약 조건을 사용할 필요가 없으므로 이 방법이 더 효율적입니다.