데이터 정렬 선행 규칙
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
데이터 정렬 강제 변환 규칙이라고도 하는 데이터 정렬 우선 순위는 다음 두 가지 결과를 결정합니다.
문자열로 계산되는 식의 최종 결과의 데이터 정렬입니다.
문자열 입력을 사용하지만 LIKE 및 IN과 같은 문자 문자열을 반환하지 않는 데이터 정렬 구분 연산자에서 사용되는 데이터 정렬입니다.
데이터 정렬 우선 순위 규칙은 문자 문자열 데이터 형식(char, varchar, text, nchar, nvarchar 및 ntext)에만 적용됩니다. 다른 데이터 형식이 있는 개체는 데이터 정렬 평가에 참여하지 않습니다.
데이터 정렬 레이블
다음 표에서는 모든 개체의 데이터 정렬이 식별되는 4개의 범주를 나열하고 설명합니다. 각 범주의 이름을 데이터 정렬 레이블이라고 합니다.
데이터 정렬 레이블 | 객체의 종류 |
---|---|
Coercible-default |
모든 Transact-SQL 문자열 변수, 매개 변수, 리터럴, 또는 카탈로그 기본 제공 함수의 출력이나 문자열 입력을 사용하지 않지만 문자열 출력을 만드는 기본 제공 함수 개체가 사용자 정의 함수, 저장 프로시저 또는 트리거에 선언된 경우 개체에는 함수, 저장 프로시저 또는 트리거가 만들어지는 데이터베이스의 기본 데이터 정렬이 할당됩니다. 개체가 일괄 처리로 선언되면 개체에 연결에 대한 현재 데이터베이스의 기본 데이터 정렬이 할당됩니다. |
Implicit X |
열 참조. 식(X)의 데이터 정렬은 테이블 또는 뷰의 열에 대해 정의된 데이터 정렬에서 가져옵니다. 열이 or CREATE VIEW 문의 절을 사용하여 COLLATE 데이터 정렬을 CREATE TABLE 명시적으로 할당한 경우에도 열 참조는 암시적으로 분류됩니다. |
Explicit X |
식에서 COLLATE 절을 사용하여 특정 데이터 정렬(X)로 명시적으로 캐스팅되는 식입니다. |
No-collation |
식 값이 암시적 데이터 정렬 레이블의 데이터 정렬이 충돌하는 두 문자열 간의 연산 결과임을 나타냅니다. 식 결과는 데이터 정렬이 없는 것으로 정의됩니다. |
데이터 정렬 규칙
단 하나의 문자열 개체를 참조하는 단순 식의 데이터 정렬 레이블은 참조되는 개체의 데이터 정렬 레이블입니다.
데이터 정렬 레이블이 같은 두 피연산자 식을 참조하는 복합 식의 데이터 정렬 레이블은 피연산자 식의 데이터 정렬 레이블입니다.
데이터 정렬 레이블이 다른 두 피연산자 식을 참조하는 복합 식의 최종 결과의 데이터 정렬 레이블은 다음 규칙에 따라 결정됩니다.
명시적이 암시적보다 우선합니다. 암시적이 강제 변환-기본값보다 우선합니다.
명시적 > 암시적 > 기본값 강제 변환
서로 다른 데이터 정렬이 할당된 두 개의 명시적 식을 결합하면 오류가 발생합니다.
명시적 X + 명시적 Y = 오류
데이터 정렬이 다른 두 암시적 식을 결합하면 데이터 정렬이 없는 결과가 생성됩니다.
암시적 X + 암시적 Y = 데이터 정렬 없음
명시적 데이터 정렬(다음 규칙 참조)을 제외한 모든 레이블의 식과 식을 함께 사용하면 데이터 정렬 없음 레이블이 있는 결과가 생성됩니다.
데이터 정렬 없음 + 아무것도 = 데이터 정렬 없음
명시적 데이터 정렬이 있는 식과 No-collation을 사용하여 식을 결합하면 명시적 레이블이 있는 식이 생성됩니다.
데이터 정렬 없음 + 명시적 X = 명시적
다음 표에서는 규칙을 요약합니다.
피연산자 강제 변환 레이블 | 명시적 X | 암시적 X | 강제 변환 가능-기본값 | 데이터 정렬 없음 |
---|---|---|---|---|
Explicit Y |
오류 생성 | 결과는 명시적 Y입니다. | 결과는 명시적 Y입니다. | 결과는 명시적 Y입니다. |
Implicit Y |
결과는 명시적 X | 결과는 데이터 정렬 없음입니다. | 결과는 암시적 Y입니다. | 결과는 데이터 정렬 없음입니다. |
Coercible-default |
결과는 명시적 X | 결과는 암시적 X입니다. | 결과는 강제 변환 가능-기본값입니다. | 결과는 데이터 정렬 없음입니다. |
No-collation |
결과는 명시적 X | 결과는 데이터 정렬 없음입니다. | 결과는 데이터 정렬 없음입니다. | 결과는 데이터 정렬 없음입니다. |
다음은 데이터 정렬 선행 규칙에 적용되는 추가 규칙입니다.
이미 명시적 식인 식에는 여러 개의 COLLATE 절이 있을 수 없습니다. 예를 들어 다음
WHERE
절은 이미 명시적인 식에COLLATE
절이 지정되어 있으므로 잘못된 경우입니다.WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS
텍스트 데이터 형식에 대한 코드 페이지 변환은 허용되지 않습니다. 서로 다른 코드 페이지를 가진 경우 한 데이터 정렬에서 다른 데이터 정렬로 텍스트 식을 캐스팅할 수 없습니다. 오른쪽 텍스트 피연산자의 데이터 정렬에 왼쪽 텍스트 피연산자가 아닌 다른 코드 페이지가 있는 경우 대입 연산자는 값을 할당할 수 없습니다.
데이터 형식 변환 후에 데이터 정렬 우선 순위가 결정됩니다. 결과 데이터 정렬이 수행되는 피연산자는 최종 결과의 데이터 형식을 제공하는 피연산자와 다를 수 있습니다. 예를 들어 다음 일괄 처리를 고려합니다.
CREATE TABLE TestTab
(PrimaryKey int PRIMARY KEY,
CharCol char(10) COLLATE French_CI_AS
)
SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'
참고 항목
nvarchar 데이터 형식은 패브릭 웨어하우스에서 지원되지 않지만 이 문서의 대부분의 예제는 UTF-8 및 nvarchar를 사용하는 varchar 모두에 적용할 수 있으므로 달리 명시되지 않은 한 패브릭 웨어하우스에 적용할 수 있습니다.
간단한 N'abc'
식의 유니코드 데이터 형식은 우선 순위가 높은 데이터 형식입니다. 따라서 결과 식은 N'abc'
에 할당된 유니코드 데이터 형식을 갖게 됩니다. 그러나 식 CharCol
에는 암시적 데이터 정렬 레이블이 있으며 N'abc'
강제 변환-기본값의 강제 변환 레이블이 낮습니다. 따라서 사용되는 데이터 정렬은 .의 CharCol
데이터 정렬입니다French_CI_AS
.
데이터 정렬 규칙의 예
다음 예제에서는 데이터 정렬 규칙의 작동 방식을 보여 줍니다. 예제를 실행하려면 다음 테스트 테이블을 만듭니다.
USE tempdb;
GO
CREATE TABLE TestTab (
id int,
GreekCol nvarchar(10) collate greek_ci_as,
LatinCol nvarchar(10) collate latin1_general_cs_as
)
INSERT TestTab VALUES (1, N'A', N'a');
GO
데이터 정렬 충돌 및 오류
다음 쿼리의 조건자는 데이터 정렬 충돌이 있으며 오류를 생성합니다.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;
결과 집합은 다음과 같습니다.
Msg 448, Level 16, State 9, Line 2
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.
명시적 레이블과 암시적 레이블 비교
오른쪽 식에 Explicit 레이블이 있으므로 다음 쿼리의 조건자는 데이터 정렬 greek_ci_as
에서 평가됩니다. 이는 왼쪽 식의 암시적 레이블보다 우선합니다.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
결과 집합은 다음과 같습니다.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
(1 row affected)
데이터 정렬 없음 레이블
참고 항목
UTF-8 데이터 정렬에서 nvarchar와 varchar의 동작이 다르기 때문에 이 예제는 패브릭 웨어하우스에 적용되지 않습니다.
다음 쿼리의 식에는 CASE
데이터 정렬 없음 레이블이 있으므로 선택 목록에 표시되거나 데이터 정렬에 민감한 연산자가 작업할 수 없습니다. 그러나 데이터 정렬을 인식하지 않는 연산자로 이 식을 연산하는 것은 가능합니다.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;
결과 집합은 다음과 같습니다.
Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')
FROM TestTab;
결과 집합은 다음과 같습니다.
Msg 446, Level 16, State 9, Server LEIH2, Line 1
Cannot resolve collation conflict for patindex operation.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS
FROM TestTab;
결과 집합은 다음과 같습니다.
--------------------
a
(1 row affected)
데이터 정렬에 민감하고 데이터 정렬을 구분하지 않습니다.
연산자와 함수는 데이터 정렬에 민감하거나 민감하지 않습니다.
- 데이터 정렬 중요: 즉, 데이터 정렬 없음 피연산자를 지정하는 것은 컴파일 시간 오류입니다. 식 결과는 데이터 정렬 없음이 될 수 없습니다.
- 데이터 정렬을 구분하지 않음: 이는 피연산자와 결과가 데이터 정렬이 아닐 수 있음을 의미합니다.
연산자 및 데이터 정렬
비교 연산자와 MAX
, MIN
, BETWEEN
및 LIKE
IN
연산자는 데이터 정렬에 민감합니다. 연산자가 사용하는 문자열에는 우선 순위가 더 높은 피연산자의 데이터 정렬 레이블이 할당됩니다. UNION
문도 데이터 정렬에 민감하며 모든 문자열 피연산자와 최종 결과에는 우선 순위가 가장 높은 피연산자의 데이터 정렬이 할당됩니다. 피연산자와 결과의 데이터 정렬 우선 UNION
순위는 열별로 계산됩니다.
대입 연산자는 데이터 정렬을 구분하지 않으며 오른쪽 식은 왼쪽 데이터 정렬로 캐스팅됩니다.
문자열 연결 연산자는 데이터 정렬에 민감하며, 두 문자열 피연산자와 결과에는 데이터 정렬 우선 순위가 가장 높은 피연산자의 데이터 정렬 레이블이 할당됩니다. 및 CASE
문은 UNION ALL
데이터 정렬을 구분하지 않으며 모든 문자열 피연산자와 최종 결과에는 우선 순위가 가장 높은 피연산자의 데이터 정렬 레이블이 할당됩니다. 피연산자와 결과의 데이터 정렬 우선 UNION ALL
순위는 열별로 계산됩니다.
함수 및 데이터 정렬
THE CAST
, CONVERT
및 COLLATE
함수는 char, varchar 및 텍스트 데이터 형식에 대해 데이터 정렬에 민감합니다. 및 CONVERT
함수의 CAST
입력 및 출력이 문자열인 경우 출력 문자열에는 입력 문자열의 데이터 정렬 레이블이 있습니다. 입력이 문자 문자열이 아닌 경우 출력 문자열은 강제 변환 가능한 기본값이며 연결에 대한 현재 데이터베이스의 데이터 정렬 또는 사용자 정의 함수, 저장 프로시저 또는 참조되는 트리거가 포함된 데이터베이스가 CAST
CONVERT
할당됩니다.
문자열을 반환하지만 문자열 입력을 사용하지 않는 기본 제공 함수의 경우 결과 문자열은 강제 변환 가능-기본값입니다. 결과 문자열에는 현재 데이터베이스의 데이터 정렬 또는 함수가 참조되는 사용자 정의 함수, 저장 프로시저 또는 트리거가 포함된 데이터베이스의 데이터 정렬이 할당됩니다.
다음 함수는 데이터 정렬을 구분하며 출력 문자열에는 입력 문자열의 데이터 정렬 레이블이 있습니다.
CHARINDEX
REPLACE
DIFFERENCE
REVERSE
ISNUMERIC
RIGHT
LEFT
SOUNDEX
LEN
STUFF
LOWER
SUBSTRING
PATINDEX
UPPER