함수(데이터베이스 엔진)
SQL Server 2005는 특정 작업을 수행하는 데 사용할 수 있는 기본 제공 함수를 제공합니다.
함수는 다음 항목에 사용하거나 포함될 수 있습니다.
SELECT 문을 사용하여 값을 반환하는 쿼리의 SELECT 목록
SELECT DB_NAME(); GO
쿼리를 만족하는 행을 제한하는 SELECT 또는 데이터 수정(SELECT, INSERT, DELETE 또는 UPDATE) 문의 WHERE 절 검색 조건
USE AdventureWorks; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
런타임 시 뷰가 사용자나 환경에 동적으로 맞춰지는 뷰의 검색 조건(WHERE 절)
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Contact WHERE ContactID = SUSER_SID(); GO
모든 식
데이터를 삽입할 때 지정한 값을 확인할 CHECK 제약 조건이나 트리거
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
INSERT에서 지정하지 않을 경우 값을 제공할 DEFAULT 제약 조건이나 트리거
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
함수를 지정할 때는 매개 변수가 없어도 괄호를 사용해야 합니다. 단, DEFAULT 키워드와 함께 사용되는 무항 함수일 경우는 예외입니다. 무항 함수는 매개 변수를 사용하지 않습니다. DEFAULT 키워드에 대한 자세한 내용은 ALTER TABLE(Transact-SQL) 및 CREATE TABLE(Transact-SQL)을 참조하십시오.
경우에 따라 데이터베이스, 컴퓨터, 로그인 또는 데이터베이스 사용자를 지정하는 매개 변수는 생략할 수 있습니다. 이러한 매개 변수를 지정하지 않으면 기본적으로 현재 데이터베이스, 호스트 컴퓨터, 로그인 또는 데이터베이스 사용자가 지정됩니다.
함수는 중첩될 수 있습니다.
함수 범주
다음 표에서는 SQL Server 함수에 대한 범주를 나열합니다.
함수 범주 | 설명 |
---|---|
여러 값을 하나로 결합하는 연산을 수행합니다. 예를 들면 COUNT, SUM, MIN 및 MAX 등이 있습니다. |
|
구성 설정에 대한 정보를 반환하는 스칼라 함수입니다. |
|
암호화, 암호 해독, 디지털 서명 및 디지털 서명에 대한 유효성 검사를 지원합니다. |
|
커서 상태에 대한 정보를 반환합니다. |
|
날짜 및 시간 값을 변경합니다. |
|
삼각 함수, 기하학 및 기타 수치 연산을 수행합니다. |
|
데이터베이스 및 데이터베이스 개체의 특성에 대한 정보를 반환합니다. |
|
파티션에서 각 행의 순위 값을 반환하는 비결정적 함수입니다. |
|
Transact-SQL 문에서 테이블 참조로 사용할 행 집합을 반환합니다. |
|
사용자와 역할에 대한 정보를 반환합니다. |
|
char, varchar, nchar, nvarchar, binary 및 varbinary 값을 변경합니다. |
|
다양한 시스템 수준의 옵션과 개체에 대해 작업하거나 보고합니다. |
|
SQL Server 성능에 대한 정보를 반환합니다. |
|
text 및 image 값을 변경합니다. |
결정적 함수 및 비결정적 함수
SQL Server 2005에서 함수는 엄격히 결정적, 결정적 또는 비결정적 함수로 분류됩니다.
엄격히 결정적 함수는 특정 입력 값 집합에 대해 항상 같은 결과를 반환하는 함수입니다.
사용자 정의 함수에 대해서는 조금 더 융통성 있는 결정성 개념이 적용됩니다. 특정 입력 값 집합과 데이터베이스 상태에 대해 항상 같은 결과를 반환하는 사용자 정의 함수는 결정적 함수입니다. 이러한 의미에서 엄격히 결정적이지 않은 함수가 데이터 액세스 함수인 경우 결정적 함수일 수 있습니다.
비결정적 함수는 같은 입력 값 집합에 대해 반복적으로 호출될 때 다른 결과를 반환할 수 있습니다. 예를 들어 GETDATE() 함수는 비결정적입니다. SQL Server는 다양한 비결정성 클래스에 제한을 둡니다. 따라서 비결정적 함수는 신중하게 사용해야 합니다.
기본 제공 함수에서는 결정성과 엄격한 결정성이 같은 개념입니다. Transact-SQL 사용자 정의 함수에 대해서는 시스템이 정의를 확인하고 비결정적 함수 정의를 차단합니다. 데이터 액세스 또는 스키마 바인딩되지 않은 함수는 엄격히 결정적이지 않은 것으로 간주됩니다. CLR(공용 언어 런타임) 함수인 경우 함수 정의에서 해당 함수의 결정성, 데이터 액세스 및 시스템 데이터 액세스 속성이 지정되지만 이러한 속성은 시스템에서 확인되지 않은 속성이므로 해당 함수는 항상 엄격히 결정적이지 않은 것으로 간주됩니다.
결정성이 부족한 함수는 사용할 수 있는 위치가 제한됩니다. 인덱싱된 뷰, 인덱싱된 계산 열, 지속형 계산 열 또는 Transact-SQL 사용자 정의 함수 정의에서는 결정적 함수만 호출할 수 있습니다.
함수에 엄격한 결정성이 부족한 경우 유용한 성능 최적화가 차단될 수 있습니다. 확실한 결정성 유지를 위해 계획 순서를 다시 지정하는 특정 단계는 생략됩니다. 또한 사용자 정의 함수에 대한 호출의 수, 순서 및 타이밍은 구현에 따라 달라집니다. 이러한 호출 의미 체계에 의존하지 마십시오. 기본 제공되는 비결정적 런타임 상수 RAND 및 GETDATE 계열과는 별도로 호출의 수, 순서 및 타이밍은 선택한 계획에 따라 달라집니다.
최상의 권장 방법
가능하면 다음 지침을 따르십시오.
1. 가능하면 엄격히 결정적인 함수를 작성하십시오. 특히 Transact-SQL 함수를 스키마 바운드로 만드십시오.
2. 비결정적 함수는 가장 바깥쪽 SELECT 목록에만 제한적으로 사용하십시오.
3. 성능에 중요한 영향을 주는 쿼리에는 비결정적 함수를 사용하지 마십시오.
4. 호출의 수, 순서 또는 타이밍은 구현에 따라 달라질 수 있으므로 의존하지 마십시오.
자세한 내용은 결정적 함수 및 비결정적 함수를 참조하십시오.