#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