本文說明 Entity SQL 與 Transact-SQL 之間的差異。
繼承和關聯性支援
Entity SQL 直接與概念實體架構搭配使用,並支援繼承和關聯性等概念模型功能。
使用繼承時,從超類型實例集合中選取子類型的實例通常很有用。 Entity SQL 中的 oftype 運算符(類似於 oftype
C# 序列中),提供這項功能。
集合支援
Entity SQL 會將集合視為一流的實體。 例如:
from
子句中的集合表達式是有效的。in
和exists
子查詢已一般化以允許任何集合。子查詢是一種集合。
e1 in e2
和exists(e)
是用來執行這些作業的 Entity SQL 建構。集合運算,例如
union
、intersect
和except
,現在會在集合上運作。聯結會在集合上運作。
表達式的支援
Transact-SQL 具有子查詢(數據表)和表示式(數據列和數據行)。
為了支援集合和巢狀集合,Entity SQL 會讓所有專案成為表達式。 Entity 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
運算子左側的子查詢會被視為純量子查詢,而右側則預期為多集子查詢。
Entity SQL 會消除這些差異。 表達式具有不相依於使用內容的統一解譯。 Entity SQL 會將所有子查詢視為多重集子查詢。 如果子查詢需要純量值,Entity SQL 會提供 anyelement
在集合上運作的運算元(在此案例中為子查詢),並從集合擷取單一值。
避免子查詢的隱含強制
子查詢統一處理的相關副作用是將子查詢隱含轉換成純量值。 具體而言,在 Transact-SQL 中,多集數據列(具有單一欄位)會隱含轉換成純量值,其數據類型為欄位的純量值。
Entity 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
子句中支援有限的形式。
Entity SQL 會將子句中的 from
左側關聯進行一般化,並統一處理。 子句中的 from
表達式可以在相同子句中參考先前的定義(左邊的定義),而不需要額外的語法。
Entity 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
子句中是可選的。 數據表的名稱會當做隱含別名使用。 Entity SQL 也允許下列形式:
SELECT Tab.a FROM Tab
導覽物件
Transact-SQL 使用「.」符號來引用資料表中某一列的欄位。 Entity SQL 會擴充這個表示法(從程式設計語言借用),以支援巡覽對象的屬性。
例如,如果 p
是 Person 類型的表達式,以下是參考此人員位址之城市的 Entity SQL 語法。
p.Address.City
不支援 *
Transact-SQL 支援不限定的 * 語法作為整個數據列的別名,而限定的 * 語法(t.*)則作為該數據表欄位的快捷方式。 此外,Transact-SQL 允許特殊的 count(*) 聚合函數,其中包含空值。
Entity SQL 不支援 * 建構。 Transact-SQL 查詢形式 select * from T
和 select T1.* from T1, T2...
可以在 Entity SQL 中分別表示為 select value t from T as t
和 select value t1 from T1 as t1, T2 as t2...
。 此外,這些建構會處理繼承(值可替代性),而 select *
變體則限制為宣告型別的最上層屬性。
Entity SQL 不支持 count(*)
匯總。 請改用 count(0)
。
群組依據的變更
Entity 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
Entity 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
Entity SQL 目前不支援 DML 語句(插入、更新、刪除)。
資料定義語言 (DDL)
Entity SQL 不支援目前版本中的 DDL。
命令式程序設計
Entity SQL 不支援命令式程序設計,與 Transact-SQL 不同。 請改用程式設計語言。
群組函式
Entity SQL 尚未提供群組函式的支援(例如 CUBE、ROLLUP 和 GROUPING_SET)。
分析函數
Entity SQL 尚未提供分析函式的支援。
內建函式、運算符
Entity SQL 支援 Transact-SQL 內建函數和運算子的子集。 商店供應商可能支援這些運算元和函式。 Entity SQL 會使用提供者指令清單中宣告的存放區特定函式。 此外,Entity Framework 可讓您宣告內建和使用者定義的現有存放區函式,以供 Entity SQL 使用。
提示
Entity SQL 不提供查詢提示的機制。
批處理查詢結果
Entity SQL 不支援批處理查詢結果。 例如,下列是有效的 Transact-SQL(以批次傳送):
SELECT * FROM products;
SELECT * FROM categories;
不過,不支援對等的 Entity SQL:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Entity SQL 僅支援每個命令一個產生結果的查詢語句。