Você pode alterar um pouco a semântica fazendo isso:
SELECT ZipCode FROM
(
SELECT DISTINCT ZipCode = LEFT(tz.Zipcode, 5)
FROM dbo.TerritoryZip
) AS x
ORDER BY ZipCode;
Não resolve o problema realmente, pois a consulta é mais detalhada e você ainda não pode evitar tocá-la. A correção que você já sugeriu é melhor na minha mente porque é mais explícita sobre o que está acontecendo.
Sem querer ser duro, mas se você acha que não será capaz de "encontrar todas as instâncias desse tipo de SQL", como você está confiando em seus testes?
Eu sugeriria que manter o modo 2000 não é a resposta ideal. O motivo é que isso pode fazer com que outra sintaxe seja interrompida (por exemplo, a maneira como você pode chamar funções de gerenciamento dinâmico - consulte this Postagem do blog de Paul Randal e meu comentário a ele), você também corre o risco de perpetuar o código que deve ser corrigido (por exemplo,
*=
estilo antigo / =*
joins que são válidos no modo de compatibilidade 2000, mas não serão válidos quando você for de 2008 R2 -> Denali, que não suporta 2000 compat). Não há configuração de "rigor", mas você pode votar em SET STRICT_CHECKS ON de Erland Sommarskog; sugestão .