Почему Azure SQL не считает, что подчеркивание находится между пробелом и «ZZZZZ»?

#sql #azure-sql-database

Вопрос:

Я только что нашел, как мне кажется, ошибку в SQL Azure:

Приведенный ниже запрос показывает результаты:

Select * from table where '_' BETWEEN ' ' AND 'ZZZZZZZ' ,

но на самом деле, в моем понимании и в обычном SQL Server или Oracle, этот запрос не показывает никаких результатов.

Есть какие-нибудь мысли по этому поводу?

Комментарии:

1. Это будет зависеть от параметров сортировки, будет ли это соответствовать или нет true

Ответ №1:

Конечные пробелы не учитываются в = сравнениях и between сравнениях. Это ' ' эквивалентно тому '' , какое наименьшее ненулевое значение в порядке сортировки varchar для текущей (и, я думаю, каждой) сортировки. Это то же самое для SQL Server и базы данных SQL Azure.

В настоящее время во всех недвоичных сопоставлениях 'Z' > '_' и во всех двоичных сопоставлениях 'Z' < '_' , но ' ' всегда ниже.

Вы можете запустить сравнение во всех параметрах сортировки с помощью динамического SQL. НАПРИМЕР

 declare c cursor local for select name from fn_helpcollations()
declare @collation sysname

declare @collations table(collation sysname, is_Z_less_than_underscore bit)

open c
fetch next from c into @collation
while @@FETCH_STATUS = 0
begin
  declare @sql nvarchar(max) = 'select '''   @collation   ''', case when ''Z'' < ''_'' collate '   @collation   ' then 1 else 0 end'
  begin try
    insert into @collations
    exec (@sql)
  end try
  begin catch 
    print error_message()
  end catch
fetch next from c into @collation
end
close c
deallocate c

select *
from @collations
order by 2,1
 

Комментарии:

1. Спасибо за ваш ответ! Знаете ли вы, в каких сопоставлениях » Z » < » или «Z»>»> «?

2. См. Обновление для ответа.

3. Большое спасибо за ваш ответ, это очень помогло! Мы переносим dwh teradata в azure, и мы сталкиваемся с такими проблемами в некоторых процедурах перенесенного хранилища. У вас есть какие-нибудь идеи о том, как мы можем преодолеть эти трудности? Например, проблема с подчеркиванием в Teradata не вернула ни одной строки, в то время как в Azure она возвращается. Спасибо!

4. Teradata и SQL Server поддерживают множество различных параметров сортировки. Вам нужно посмотреть, какой из них вы используете в Teradata, и найти аналогичный в SQL Server.

5. Спасибо! В Teradata у нас есть ASCII в качестве параметров сортировки, а в SQL SQL_Latin1_General_CP1_CI_AS. Я не хочу изменять параметры сортировки на уровне бд, поэтому я попытался изменить запрос на Select * из таблицы, где (‘_’) сопоставляет ASCII МЕЖДУ (‘ ‘) сопоставляет ASCII И «ZZZZZZZ» сопоставляет ASCII, но это дает мне ошибку: Недопустимые параметры сортировки «ASCII». Пожалуйста, не знаете ли вы, как я могу исправить этот запрос? Спасибо!

Ответ №2:

Он также возвращает результаты в MS SQL. Поскольку » _ «на самом деле, похоже, находится между «‘ и «ZZZZZZZ» для определенных параметров сортировки, на самом деле это то же самое, что

 Select * from table where 1=1