本節說明與 .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 可能會傳回不正確的結果。 如果非索引鍵列中有重複的數據,可能會略過超過指定的行數目。 這是因為 SQL Server 2000 的 SKIP 轉譯方式。 例如,在下列查詢中,如果 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 清單中的數據行名稱符合選取器中的數據行名稱,您可能會失去排序資訊。
投影中的巢狀查詢
投影子句中的巢狀查詢可能會轉譯為伺服器上的笛卡兒產品查詢。 在某些後端伺服器上,包括 SQL 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 類型。