이 문서에서는 Entity SQL과 Transact-SQL 간의 차이점을 설명합니다.
상속 및 관계 지원
Entity SQL은 개념적 엔터티 스키마와 직접 작동하며 상속 및 관계와 같은 개념적 모델 기능을 지원합니다.
상속을 사용하는 경우 상위 형식 인스턴스 컬렉션에서 하위 형식의 인스턴스를 선택하는 것이 유용한 경우가 많습니다. Entity SQL 의 oftype 연산자(C# 시퀀스에서와 유사 oftype )는 이 기능을 제공합니다.
컬렉션 지원
Entity SQL은 컬렉션을 일류 엔터티로 처리합니다. 다음은 그 예입니다.
컬렉션 식은
from절에서 유효합니다.in및exists하위 쿼리는 모든 컬렉션을 허용하도록 일반화되었습니다.하위 쿼리는 컬렉션의 한 종류입니다.
e1 in e2및exists(e)이러한 작업을 수행하기 위한 Entity SQL 구문입니다.집합 연산(예:
union,intersect및except)이 이제 컬렉션에서 작동합니다.조인은 컬렉션에서 작동합니다.
표현식 지원
Transact-SQL에는 하위 쿼리(테이블)와 식(행 및 열)이 포함되어 있습니다.
컬렉션 및 중첩된 컬렉션을 지원하기 위해 Entity SQL은 모든 항목을 식으로 만듭니다. 엔터티 SQL은 Transact-SQL보다 더 구성 가능하며 모든 식을 어디서나 사용할 수 있습니다. 쿼리 식은 항상 프로젝션된 형식의 컬렉션을 생성하며 컬렉션 식이 허용되는 모든 곳에서 사용할 수 있습니다. Entity SQL에서 지원되지 않는 Transact-SQL 식에 대한 자세한 내용은 지원되지 않는 식을 참조하세요.
다음은 모두 유효한 Entity SQL 쿼리입니다.
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
하위 쿼리의 균일한 처리
테이블에 중점을 두면 Transact-SQL 하위 쿼리의 컨텍스트 해석을 수행합니다. 예를 들어 절의 하위 쿼리 from 는 다중 집합(테이블)으로 간주됩니다. 그러나 절에 select 사용된 동일한 하위 쿼리는 스칼라 하위 쿼리로 간주됩니다. 마찬가지로 연산자의 왼쪽 in 에 사용되는 하위 쿼리는 스칼라 하위 쿼리로 간주되는 반면 오른쪽은 다중 집합 하위 쿼리가 될 것으로 예상됩니다.
엔터티 SQL은 이러한 차이를 제거합니다. 식에는 사용되는 컨텍스트에 따라 달라지지 않는 균일한 해석이 있습니다. 엔터티 SQL은 모든 하위 쿼리를 다중 집합 하위 쿼리로 간주합니다. 하위 쿼리에서 스칼라 값을 원하는 경우 Entity SQL은 컬렉션에서 작동하는 연산자(이 경우 하위 쿼리)를 제공하고 anyelement 컬렉션에서 싱글톤 값을 추출합니다.
하위 쿼리에 대한 암시적 강제 변환 방지
하위 쿼리의 균일한 처리의 관련 부작용은 하위 쿼리를 스칼라 값으로 암시적으로 변환하는 것입니다. 특히 Transact-SQL에서 여러 행 집합(단일 필드 포함)은 데이터 형식이 필드의 스칼라 값으로 암시적으로 변환됩니다.
엔터티 SQL은 이 암시적 강제 변환을 지원하지 않습니다. Entity SQL은 컬렉션에서 싱글톤 값을 추출하는 ANYELEMENT 연산자를 제공하며, 쿼리 식 중에 행 래퍼를 만들지 않도록 하는 select value 절을 제공합니다.
값 선택: 암시적 행 래퍼 방지
Transact-SQL 하위 쿼리의 select 절은 절의 항목 주위에 자동으로 행 래퍼를 생성합니다. 이는 스칼라 또는 개체의 컬렉션을 만들 수 없음을 의미합니다. Transact-SQL 하나의 필드와 동일한 데이터 형식의 rowtype 싱글톤 값 간에 암시적 강제 변환을 허용합니다.
Entity SQL은 select value 암시적 행 생성을 건너뛰는 절을 제공합니다. 절에는 select value 하나의 항목만 지정할 수 있습니다. 이러한 절을 사용하면 select 절의 항목 주위에 행 래퍼가 생성되지 않으며, 예를 들어 원하는 형태의 컬렉션이 생성될 수 있습니다 select value a.
또한 Entity SQL은 임의의 행을 생성하는 행 생성자를 제공합니다.
select 는 프로젝션에서 하나 이상의 요소를 사용하고 필드가 있는 데이터 레코드를 생성합니다.
select a, b, c
왼쪽 상관 관계 및 에일리어싱
Transact-SQL에서 지정된 범위의 식(예: select 또는 from같은 단일 절)은 동일한 범위의 앞부분에서 정의된 식을 참조할 수 없습니다. SQL의 일부 방언(Transact-SQL포함)은 from 절에서 제한된 형식의 기능을 지원합니다.
엔터티 SQL은 절의 from 왼쪽 상관 관계를 일반화하고 균일하게 처리합니다. 동일한 절 내에서 from 항목은 추가 구문 없이도 이전에 정의된 항목(왼쪽으로 정의된 항목)을 참조할 수 있습니다.
엔터티 SQL은 group by 절이 포함된 쿼리에 추가적인 제한을 가합니다. 이러한 쿼리의 select 절과 having 절에 있는 식은 반드시 group by 키를 별칭을 통해서만 참조해야 합니다. 다음 구문은 Transact-SQL 유효하지만 Entity SQL에는 없습니다.
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Entity SQL에서 이 작업을 수행하려면 다음을 수행합니다.
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
테이블의 열(속성) 참조(컬렉션)
Entity SQL의 모든 열 참조는 테이블 별칭으로 한정되어야 합니다. 다음 구문(테이블a의 유효한 열이라고 T 가정)은 Transact-SQL 유효하지만 Entity SQL에서는 유효하지 않습니다.
SELECT a FROM T
Entity SQL 형식은
SELECT t.a AS A FROM T AS t
from 절에서 테이블 별칭은 옵션입니다. 테이블의 이름은 암시적 별칭으로 사용됩니다. 엔터티 SQL에서는 다음 양식도 허용합니다.
SELECT Tab.a FROM Tab
개체를 통한 탐색
Transact-SQL 테이블의 열(행)을 참조하는 데 "." 표기법을 사용합니다. Entity SQL은 이 표기법(프로그래밍 언어에서 차용)을 확장하여 개체의 속성을 탐색할 수 있도록 지원합니다.
예를 들어 Person 형식의 식인 경우 p 이 사용자의 주소 도시를 참조하기 위한 Entity SQL 구문은 다음과 같습니다.
p.Address.City
*에 대한 지원 없음
Transact-SQL 정규화되지 않은 * 구문을 전체 행의 별칭으로 지원하고 정규화된 * 구문(t.*)을 해당 테이블 필드의 바로 가기로 지원합니다. 또한 Transact-SQL null을 포함하는 특수 개수(*) 집계를 허용합니다.
Entity SQL은 * 구문을 지원하지 않습니다. 양식 select * from T과 select T1.* from T1, T2...의 쿼리는 Transact-SQL에서 엔터티 SQL로 각각 select value t from T as t 및 select value t1 from T1 as t1, T2 as t2...로 표현할 수 있습니다. 또한 이러한 구문은 상속(값 대체성)을 처리하지만 select * 변형은 선언된 형식의 최상위 속성으로 제한됩니다.
엔터티 SQL은 count(*) 집계를 지원하지 않습니다.
count(0)를 대신 사용하세요.
그룹화 기준 변경
엔터티 SQL은 키의 group by 별칭 지정을 지원합니다.
select 절과 having 절에서의 식은 이러한 별칭을 통해 group by 키를 참조해야 합니다. 예를 들어 이 Entity SQL 구문은 다음과 같습니다.
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... 는 다음 Transact-SQL과 동일합니다.
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Collection-Based 집계
Entity SQL은 두 가지 종류의 집계를 지원합니다.
컬렉션 기반 집계는 컬렉션에서 작동하고 집계된 결과를 생성합니다. 쿼리의 아무 곳에나 나타날 수 있으며 group by 절이 필요하지 않습니다. 다음은 그 예입니다.
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
엔터티 SQL은 SQL 스타일 집계도 지원합니다. 다음은 그 예입니다.
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
ORDER BY 절 사용
Transact-SQL는 ORDER BY 절을 오직 최상단 SELECT .. FROM .. WHERE 블록에만 지정할 수 있습니다. Entity SQL에서는 중첩된 ORDER BY 식을 사용할 수 있으며 쿼리의 아무 곳에나 배치할 수 있지만 중첩된 쿼리의 순서는 유지되지 않습니다.
-- The following query will order the results by the last name
SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact AS C1
ORDER BY C1.LastName
-- In the following query ordering of the nested query is ignored.
SELECT C2.FirstName, C2.LastName
FROM (SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact as C1
ORDER BY C1.LastName) as C2
식별자
Transact-SQL에서 식별자 비교는 현재 데이터베이스의 데이터 정렬을 기반으로 합니다. Entity SQL에서 식별자는 항상 대/소문자를 구분하지 않고 악센트를 구분합니다(즉, Entity SQL은 악센트가 있는 문자와 악센트가 없는 문자를 구분합니다. 예를 들어, 'a'는 'ấ'와 같지 않습니다). Entity SQL은 동일하게 표시되지만 다른 코드 페이지의 문자 버전을 다른 문자로 처리합니다. 자세한 내용은 입력 문자 집합을 참조하세요.
엔터티 SQL에서 사용할 수 없는 Transact-SQL 기능
Entity SQL에서는 다음 Transact-SQL 기능을 사용할 수 없습니다.
데이터 조작 언어 (DML)
엔터티 SQL은 현재 DML 문(삽입, 업데이트, 삭제)을 지원하지 않습니다.
데이터 정의 언어 (DDL)
엔터티 SQL은 현재 버전에서 DDL을 지원하지 않습니다.
명령적 프로그래밍
Entity SQL은 Transact-SQL과 달리 명령적 프로그래밍을 지원하지 않습니다. 대신 프로그래밍 언어를 사용합니다.
그룹화 함수
엔터티 SQL은 아직 그룹화 함수(예: CUBE, ROLLUP 및 GROUPING_SET)를 지원하지 않습니다.
분석 함수
엔터티 SQL은 분석 함수에 대한 지원을 제공하지 않습니다(아직).
기본 제공 함수, 연산자
Entity SQL은 Transact-SQL의 기본 제공 함수 및 연산자의 하위 집합을 지원합니다. 이러한 연산자와 함수는 주 저장소 공급자에서 지원될 가능성이 높습니다. 엔터티 SQL은 공급자 매니페스트에 선언된 저장소별 함수를 사용합니다. 또한 Entity Framework를 사용하면 Entity SQL에서 사용할 기본 제공 및 사용자 정의 기존 저장소 함수를 선언할 수 있습니다.
힌트
엔터티 SQL은 쿼리 힌트에 대한 메커니즘을 제공하지 않습니다.
쿼리 결과 일괄 처리
엔터티 SQL은 쿼리 결과 일괄 처리를 지원하지 않습니다. 예를 들어 다음은 유효한 Transact-SQL(일괄 처리로 전송)입니다.
SELECT * FROM products;
SELECT * FROM categories;
그러나 해당 엔터티 SQL은 지원되지 않습니다.
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Entity SQL은 명령당 하나의 결과 생성 쿼리 문만 지원합니다.