Миграция с SQL Server 2000 на 2008 - проблема ORDER BY при использовании DISTINCT - PullRequest
1 голос
/ 31 августа 2011

В настоящее время мы тестируем наше приложение с SQL Server 2000 до 2008R2.

Следующий оператор работает в 2000 году, а не в 2008 году.

select distinct left(tz.Zipcode,5) as zipCode
from TerritoryZip tz 
order by tz.Zipcode

Сообщение об ошибке:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

Исправление простое:

select distinct left(tz.Zipcode,5) as zipCode
from TerritoryZip tz 
order by left(tz.Zipcode,5)

Однако существует риск, что мы не сможем найти все экземпляры этого типа SQL.

Таким образом, одним из решений может быть установка уровня совместимости на 2000 - каковы недостатки этого (например, производительность без обновления SQL для использования этого более строгого подхода)?

И есть ли другие параметры / настройки, например, есть ли параметр «строгость», который обеспечивает соблюдение передовых методов и т. Д.? ...

Спасибо !!

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Вы можете немного изменить семантику, выполнив это:

SELECT ZipCode FROM 
(
  SELECT DISTINCT ZipCode = LEFT(tz.Zipcode, 5)
    FROM dbo.TerritoryZip
) AS x
ORDER BY ZipCode;

На самом деле проблема не решается, поскольку запрос более многословен, и вы все равно не можете избежать его прикосновения.Исправление, которое вы уже предложили, лучше, на мой взгляд, потому, что в нем более подробно рассказывается о том, что происходит.

Не для того, чтобы быть грубым, но если вы не думаете, что сможете "найти всеслучаи такого типа SQL "тогда как вы вообще доверяете своему тестированию?

Я бы сказал, что поддержание режима 2000 не является оптимальным ответом.Причина в том, что это может привести к нарушению другого синтаксиса (например, как вы можете вызывать динамические функции управления - см. это сообщение в блоге Пола Рэндала и мой комментарий к нему), вы также рискуете увековечить код, который долженбыть исправлено (например, объединения *= / =* в старом стиле, которые действительны в режиме сравнения 2000, но не будут действительными, если вы перейдете с 2008 R2 -> Denali, который не поддерживает сравнение 2000).

Нет настройки "строгости", но вы можете проголосовать за SET STRICT_CHECKS ON Эрланна Соммарскога;предложение .

3 голосов
/ 31 августа 2011

Таким образом, одним из решений может быть установка уровня совместимости на 2000 - каковы его недостатки (например, производительность без обновления SQL для использования этого более строгого подхода)?

Я предлагаю вам взглянуть на документацию Уровень совместимости ALTER DATABASE (Transact-SQL) , в которой перечислены десятки различий между уровнями совместимости, а также возможность воздействия низкого среднего и высокого.

Также вам, вероятно, следует запустить Upgrade Advisor , который просматривает ваши компоненты на предмет потенциальных проблем, которые вам необходимо исправить

0 голосов
/ 31 августа 2011

В MSDN действительно хорошая статья, в которой показаны различия между различными уровнями совместимости в SQL Server 2008 (включая замечания по производительности и рекомендации): http://msdn.microsoft.com/en-us/library/bb510680.aspx. Даже в приведенном вами примере SQL в версии 2008 более интуитивно понятный и обеспечивает лучшую передовую практику.

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