Известные проблемы поставщика данных .NET Framework для SQL Server (SqlClient) для платформы Entity Framework
В данном разделе описаны известные проблемы, связанные с поставщиком данных .NET Framework для SQL Server (SqlClient).
Конечные пробелы в строковых функциях
SQL Server пропускает конечные пробелы в строковых значениях. Таким образом, передача конечных пробелов в строку может привести к непредсказуемым результатам и даже сбоям.
Если в строке имеются конечные пробелы, рекомендуется добавить в конец пробельный символ так, чтобы SQL Server не усекал строку. Если конечные пробелы не требуются, их следует усекать до их последующей передачи по конвейеру запросов.
RIGHT, функция
Если в RIGHT(nvarchar(max), 0**)** или RIGHT(varchar(max), 0**)** в качестве первого аргумента передается значение, отличное от null, а в качестве второго аргумента передается значение, равное 0, то вместо строки empty будет возвращено значение типа NULL.
Операторы CROSS APPLY и OUTER APPLY
Операторы CROSS и OUTER APPLY появились в версии SQL Server 2005 . В некоторых случаях конвейер запросов может сформировать инструкцию Transact-SQL, содержащую операторы CROSS APPLY и OUTER APPLY. Так как некоторые внутренние поставщики, включая версии SQL Server, которые предшествовали SQL Server 2005 , не поддерживают данные операторы, эти запросы нельзя выполнить на данных поставщиках.
Далее показаны некоторые стандартные сценарии, которые могут привести к появлению операторов CROSS APPLY и OUTER APPLY в выходном запросе.
Связанный вложенный запрос с разбиением на страницы.
AnyElement над коррелированным вложенным запросом или коллекцией, сформированной навигацией.
LINQ-запросы, использующие методы группирования, принимающие элемент selector.
Запрос, в котором явно указан оператор 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 нацеливается на запрос Transact-SQL на основе версии SQL Server, указанной в атрибуте ProviderManifestToken элемента схемы в файле режима хранения (файл SSDL). Данная версия может отличаться от фактической версии 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 версии SQL Server, а для уровня совместимости базы данных установлено значение «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
Entity Framework поддерживает формируемые сервером значения идентификаторов GUID, однако поставщик должен поддерживать возвращение формируемых сервером значений идентификаторов после вставки строк. Начиная с выпуска SQL Server 2005 в базе данных SQL Server можно возвращать формируемый сервером тип идентификатора GUID посредством предложения OUTPUT .
См. также
Основные понятия
Поставщик данных .NET Framework для SQL Server (SqlClient) на платформе Entity Framework
Известные проблемы и замечания по LINQ to Entities