適用於 Entity Framework 的 SqlClient 已知問題
本節說明與 .NET Framework Data Provider for SQL Server (SqlClient) 相關的已知問題。
字串函式中的尾端空白
SQL Server 會忽略字串值的尾端空白。 因此,在字串中傳遞尾端空白會導致無法預期的結果,甚至產生錯誤。
如果字串必須有尾端空白,應該考慮在尾端附加空白字元,這樣 SQL Server 才不會修剪該字串。 如果尾端空白是不必要的,則應該在查詢管線中傳遞前先行修剪掉。
RIGHT 函式
如果將非 null
值傳遞做為第一個引數並將 0 傳遞做為第二個引數,成為 RIGHT(nvarchar(max)
, 0)
或 RIGHT(varchar(max)
, 0)
,則會傳回 NULL
值,而非 empty
字串。
CROSS 和 OUTER APPLY 運算子
CROSS 及 OUTER APPLY 運算子是在 SQL Server 2005 引入。 在某些案例中,查詢管線可能產生含有 CROSS APPLY 和 (或) OUTER APPLY 運算子的 Transact-SQL 陳述式。 因為有些後端提供者 (包括 SQL Server 2005 之前的 SQL Server 版本) 不支援這些運算子,因此這類的查詢無法在這些後端提供者上執行。
下列是可能會導致輸出查詢中出現 CROSS APPLY 和 (或) OUTER APPLY 運算子的部分典型案例:
具有分頁的相互關聯子查詢。
相互關聯子查詢或巡覽產生的集合上的
AnyElement
。使用接受元素選擇器的群組方法的 LINQ 查詢。
當中有明確指定 CROSS APPLY 或 OUTER APPLY 的查詢。
具有 DEREF 建構對 REF 建構的查詢。
SKIP 運算子
如果您使用的是 SQL Server 2000,對非索引鍵資料行搭配使用 SKIP 和 ORDER BY,可能會傳回不正確的結果。 如果非索引鍵資料行中有重複的資料,可能會略過超過所指定數目的資料行。 這是因為 SKIP 針對 SQL Server 2000 轉譯的方式所造成。 舉例來說,在下列查詢中,如果 E.NonKeyColumn
有重複的值,就會略過超過五個資料行:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
以正確的 SQL Server 版本為目標
Entity Framework 是依據儲存體模型檔案 (.ssdl) Schema 元素的 ProviderManifestToken
屬性所指定的 SQL Server 版本,做為 Transact-SQL 查詢的目標版本。 這個版本可能會因您所連接的 SQL Server 實際版本而有所不同。 例如,如果使用的是 SQL Server 2005,但 ProviderManifestToken
屬性卻設為 2008,則產生的 Transact-SQL 查詢可能無法在伺服器執行。 例如,如果查詢使用的是 SQL Server 2008 中引入的新日期時間型別的話,將無法在舊版的 SQL Server 上執行查詢。 如果使用的是 SQL Server 2005,但 ProviderManifestToken
屬性卻設為 2000,則產生的 Transact-SQL 查詢最佳化效果可能會打折,或者會收到例外狀況指出不支援該查詢。 如需詳細資訊,請參閱本主題前面的「CROSS 和 OUTER APPLY 運算子」一節。
某些資料庫行為取決於資料庫上設定的相容性層級。 如果 ProviderManifestToken
屬性是設為 2005 而 SQL Server 版本是 2005,但資料庫的相容性層級是設為 「80」 (SQL Server 2000),則產生的 Transact-SQL 會以 SQL Server 2005 為目標,但由於相容性層級設定的關係,執行的方式可能與預期的方式不同。 例如,當 ORDER BY 清單中資料行名稱與選擇器中資料行名稱相符合時,則可能會遺失排序資訊。
投影中的巢狀查詢
投影子句中的巢狀查詢可能會在伺服器上轉譯成笛卡兒乘積 (Cartesian Product) 查詢。 在包括 SLQ Server 的某些後端伺服器,這可能會導致 TempDB 資料表變得相當大。 這樣會降低伺服器的效能。
下列是投影子句中巢狀查詢的範例:
SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c
伺服器產生的 GUID 識別值
Entity Framework 支援伺服器產生的 GUID 識別值,但是提供者必須支援在資插入資料列之後,傳回伺服器產生的識別值。 從 SQL Server 2005 開始,您可透過 OUTPUT 子句在 SQL Server 資料庫傳回伺服器產生的 GUID 類型。