SqlClient 中的已知问题(实体框架)
本节介绍与 SQL Server .NET Framework 数据提供程序 (SqlClient) 有关的已知问题。
字符串函数中的尾随空格
SQL Server 忽略字符串值中的尾随空格。 因此,传递字符串中的尾随空格可能导致意外的结果,甚至会导致失败。
如果字符串中必须包含尾随空格,应考虑在末尾追加一个空白字符,这样 SQL Server 就不会修整该字符串。 如果尾随空格不是必需的,应在传递给查询管道之前进行修整。
RIGHT 函数
如果将非 null
值和 0 分别作为第一个自变量和第二个自变量传递给 RIGHT(nvarchar(max)
, 0)
或 RIGHT(varchar(max)
, 0)
,将返回 NULL
值,而不是 empty
字符串。
CROSS 和 OUTER APPLY 运算符
SQL Server 2005 引入了 CROSS 和 OUTER APPLY 运算符。 在某些情况下,查询管道可能生成包含 CROSS APPLY 和/或 OUTER APPLY 运算符的 Transact-SQL 语句。 由于某些后端提供程序(包括 SQL Server 2005 之前的 SQL Server 版本)不支持这些运算符,因此无法在这些后端提供程序上执行此类查询。
下面是一些可能导致输出查询中出现 CROSS APPLY 和/或 OUTER APPLY 运算符的典型情况:
带分页的相关子查询。
相关子查询或导航所生成的集合上的
AnyElement
。使用接受元素选择器的分组方法的 LINQ 查询。
显式指定了 CROSS APPLY 或 OUTER APPLY 的查询
在 REF 构造上具有 DEREF 构造的查询。
SKIP 运算符
如果你使用的是 SQL Server 2000,对非键列同时使用 SKIP 和 ORDER BY 可能返回不正确的结果。 如果非键列中有重复数据,那么跳过的行数可能多于指定的行数。 这是由于 SQL Server 2000 对 SKIP 的解释方式造成的。 例如,在下面的查询中,如果 E.NonKeyColumn
有重复值,则跳过的行可能超过 5 行:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
以正确的 SQL Server 版本为目标
以基于 SQL Server 版本(在存储模型 (.ssdl) 文件中 Schema 元素的 ProviderManifestToken
特性中指定)的 Transact-SQL 查询为实体框架目标。 您实际连接到的 SQL Server 的版本可能不是这一版本。 例如,如果您使用的是 SQL Server 2005,但 ProviderManifestToken
特性设置为 2008,则可能无法在服务器上执行生成的 Transact-SQL 查询。 例如,在 SQL Server 的早期版本上,无法执行使用了 SQL Server 2008 所引入的新日期时间类型的查询。 如果您使用的是 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 列表中的列名与选择器中的列名相同,则可能会丢失排序信息。
投影中的嵌套查询
投影子句中的嵌套查询可在服务器上转换为笛卡尔积查询。 在某些后端服务器(包括 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 标识值
实体框架支持服务器生成的 GUID 类型标识值,但提供程序必须支持在插入行后返回服务器生成的标识值。 从 SQL Server 2005 开始,你可以通过 OUTPUT 子句在 SQL Server 数据库中返回服务器生成的 GUID 类型。