Поделиться через


Известные проблемы поставщика данных .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