다음을 통해 공유


계산 열

계산 열은 동일한 테이블의 다른 열을 사용할 수 있는 식에서 계산됩니다. 식은 계산되지 않은 열 이름, 상수, 함수, 변수 및 이러한 요소를 하나 이상의 연산자로 연결한 조합이 될 수 있습니다. 식은 하위 쿼리가 될 수 없습니다.

예를 들어 AdventureWorks2008R2 예제 데이터베이스에서 Sales.SalesOrderHeader 테이블의 TotalDue 열에는 TotalDue AS Subtotal + TaxAmt + Freight라는 정의가 있습니다.

따로 지정하지 않으면 계산 열은 테이블에 물리적으로 저장되지 않은 가상 열입니다. 이러한 값은 쿼리에서 참조될 때마다 다시 계산됩니다. 데이터베이스 엔진에서는 CREATE TABLE 및 ALTER TABLE 문에서 PERSISTED 키워드를 사용하여 계산 열을 테이블에 물리적으로 저장합니다. 이러한 값은 계산에 포함된 열이 변경될 때마다 업데이트됩니다. 계산 열을 PERSISTED로 표시하면 계산 열에 대한 인덱스를 만들 수 있습니다. 이러한 인덱스는 결정적이지만 정확하지 않습니다. 또한 계산 열이 CLR 함수를 참조하는 경우 데이터베이스 엔진에서 함수가 실제로 결정적인지 여부를 확인할 수 없습니다. 이 경우 인덱스를 만들 수 있도록 계산 열이 PERSISTED여야 합니다. 자세한 내용은 계산 열에 인덱스 만들기를 참조하십시오.

[!참고]

분할된 테이블의 분할 열로 사용되는 모든 계산 열은 명시적으로 지속형이어야 합니다.

계산 열은 SELECT 목록, WHERE 절, ORDER BY 절 또는 일반 식을 사용할 수 있는 모든 위치에서 사용할 수 있습니다. 단, 다음과 같은 경우는 예외입니다.

  • CHECK, FOREIGN KEY 또는 NOT NULL 제약 조건으로 사용되는 계산 열은 PERSISTED로 표시되어야 합니다. 계산 열 값이 결정적 식에 의해 정의되고 결과의 데이터 형식이 인덱스 열에 허용되는 경우에는 계산 열을 인덱스의 키 열이나 PRIMARY KEY 또는 UNIQUE 제약 조건의 일부로 사용할 수 있습니다.

    예를 들어 테이블에 ab라는 정수 열이 있는 경우 계산 열 a + b를 인덱싱할 수 있지만 계산 열 a + DATEPART(dd, GETDATE())는 호출할 때마다 값이 바뀌므로 인덱싱할 수 없습니다.

  • 계산 열은 INSERT 또는 UPDATE 문의 대상이 될 수 없습니다.

데이터베이스 엔진은 사용된 식에 기반하여 계산 열의 Null 허용 여부를 자동으로 결정합니다. 대부분 식의 결과는 언더플로 또는 오버플로가 Null 결과를 생성할 수 있으므로 Null이 허용되지 않는 열만 있는 경우에도 Null이 허용되는 것으로 간주됩니다. AllowsNull 속성과 함께 COLUMNPROPERTY 함수를 사용하여 테이블에 있는 계산 열의 Null 허용 여부를 확인합니다. ISNULL(check_expression**,**constant)을 지정하면 Null을 허용하는 식을 Null을 허용하지 않는 식으로 변환할 수 있습니다. 여기서 constant는 Null 결과를 대체할 Null이 아닌 값입니다.