Функции SQL Server 2008 T-SQL не учитывают уровни совместимости - PullRequest
3 голосов
/ 24 октября 2011

Я случайно использовал несколько функций T-SQL в SQL Server 2008 в сценарии, содержащем функцию, которая будет развернута в многочисленных клиентских базах данных, некоторые из которых будут SQL 2005.

Пример оскорбительного высказывания:

create function dbo.fnThisWontWorkOnSQL2005
    ()
returns varchar(max)
as
begin
    declare @intCounter int = 2
    return @intCounter
end

select dbo.fnThisWontWorkOnSQL2005()

В экземпляре SQL2008 возвращается 2.

В экземпляре SQL2005 это советует "Невозможно назначить значение по умолчанию локальной переменной."

Однако в базе данных SQL 2005, установленной уровнем совместимости, работающей на экземпляре SQL2008 R2, код выполняется успешно и возвращает 2.

Моя проблема возникает при разработке экземпляра SQL2008R2, и я предполагал, что установка уровня совместимости целевой базы данных на SQL Server 2005 пометит любой недопустимый T-SQL, хотя этого НЕ происходит, или, по крайней мере, я могу не найти ничего, чтобы предотвратить это.

Кто-нибудь знает, как предотвратить это? Я искал по-разному, но не могу найти способ, и мне кажется, что это ошибка, или мне всегда нужно разрабатывать самую низкую версию SQL, на которую я буду развертывать?

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Это правильно.

Уровень совместимости не означает «работать точно так же, как в старой версии»
Это означает «ломайся реже, пока я исправляю код».

Никогда не предполагайте: проверьте. Это то, что ALTER DATABASE говорит на MSDN (мое выделение жирным шрифтом):

Уровень совместимости обеспечивает только частичную обратную совместимость с более ранними версиями SQL Server. Используйте уровень совместимости в качестве вспомогательного средства для миграции interim , чтобы обойти версии различий в поведении, которое контролируется соответствующей настройкой уровня совместимости. Если существующие приложения SQL Server подвержены поведенческим различиям в SQL Server 2008, преобразует приложение для правильной работы

Если вы нацелены на SQL Server 2005, разработайте на SQL Server 2005. См. Разработка приложения SQL 2005 с использованием сервера SQL 2008 тоже

2 голосов
/ 24 октября 2011

Однако в базе данных SQL 2005, установленной уровнем совместимости, работающим на экземпляре SQL2008 R2, код выполняется успешно и возвращает 2.

Переход на уровень совместимости 90 не приводит к изменению базы данных.для базы данных SQL Server 2005 это по-прежнему база данных SQL Server 2008 R2.

Уровень совместимости не позволяет предотвратить выполнение каких-либо действий в SQL Server 2008, он предназначен для выполнения функций, которые были в SQLВ SQL Server 2008 Server 2005 ведет себя так же, как и раньше.

1 голос
/ 24 октября 2011

ОК, на этот вопрос уже ответили до смерти, но дальше убейте его:

Функциональные возможности уровня совместимости предназначены для обеспечения того, чтобы приложение SQL Server 2005 могло работать с минимальными изменениями или без изменений в экземпляре SQL Server 2008 (или между любыми двумя версиями в основном). Его единственная цель состоит в том, чтобы иметь дело с изменениями в синтаксисе , где существующий код, вероятно, будет работать некорректно в 2008 году (или в любой более поздней версии, с которой вы имеете дело).

Существует огромный список вещей, которые идеально подходят для баз данных 2005 и 2008 годов, даже если установлен уровень совместимости 80 (SQL Server 2000): - MERGE заявления - CTEs - Значения по умолчанию для объявленных параметров - Новые типы данных (например, NVarChar (Max)) - список можно продолжать и продолжать.

Мне стыдно сказать, что основная система, с которой я работаю, все еще работает в режиме совместимости с SQL Server 2000, хотя мы сейчас находимся на SQL Server 2008 R2; Мы используем множество новых функций, мы просто не удосужились исправить все наши настольные подсказки. Уровень совместимости был в значительной степени создан для ленивых людей, таких как я :) (или, скорее, чтобы уменьшить трение при обновлениях, чтобы помочь продавать больше единиц более новых версий и уменьшить необходимое окно поддержки на старых версиях серверов SQL - хорошие цели сами по себе справа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...