Неверная строка порядка сортировки с буквой «ک» в SQL Порядок сортировки сервера - PullRequest
0 голосов
/ 17 июня 2020

У меня проблема с Order By в запросе сервера SQL и персидском языке. Я не могу сортировать персидский текст очень хорошо.

Я использую тип NVarchar(X), и все правильно, даже запросы select и Like. но когда я пытаюсь отсортировать строковое поле, я вижу, что в конце идет только буква «ک», даже после буквы «ی». Прямо сейчас я использую сопоставление Persian_100_CI_AS.

Например

SELECT TOP (200) Id, Name
FROM Groups
ORDER BY Name DESC

Результат:

ID       Name
------------------------------    
10071   کنترل کیفیت> مدیر
10018   کنترل کیفیت> پرسنل

Предыдущие строки не должны оставаться в первой строке в случае в порядке убывания.

10040   وظایف - مدیریت
10031   واحد شبکه
10046   نیروی فنی - برق چاپ> پرسنل
10067   Iso 17025> پرسنل
10011    آزمایشگاه - فرمولها - شرایط خط - کنترل کیفیت - برنامه تولید - آمار - گزارش تولید
10043    آزمایشگاه - فرمولها - شرایط خط - کنترل کیفیت - آمار - گزارش تولید 2

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 18 июня 2020

Возможно, ваши поля имеют другие параметры сортировки, чем вы думаете. Запустите этот запрос, чтобы узнать, что у вас есть в вашей БД. Точно ли они Persian_100_CI_AS?

DECLARE @defaultCollation NVARCHAR(1000)
SET @defaultCollation = CAST(
      DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS NVARCHAR(1000)
  )

SELECT C.Table_Name,
     Column_Name,
     Collation_Name,
     @defaultCollation DefaultCollation
FROM   Information_Schema.Columns C
     INNER JOIN Information_Schema.Tables T
          ON  C.Table_Name = T.Table_Name
WHERE  T.Table_Type = 'Base Table'
     AND RTRIM(LTRIM(Collation_Name)) <> RTRIM(LTRIM(@defaultCollation))
     AND COLUMNPROPERTY(OBJECT_ID(C.Table_Name), Column_Name, 'IsComputed') = 0
ORDER BY
     C.Table_Name,
     C.Column_Name

Если сопоставления отличаются, запустите этот запрос, который даст вам Alter операторов для их запуска и исправления несовместимой проблемы сопоставления.

DECLARE @defaultCollation NVARCHAR(1000)
SET @defaultCollation = CAST(
      DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS NVARCHAR(1000)
  )


select 'ALTER TABLE '
+ QUOTENAME(C.TABLE_SCHEMA)
+'.'+ QUOTENAME(C.Table_Name)
+' ALTER COLUMN ' +' [' +Column_Name+'] '
+  DATA_TYPE+'('+cast(character_maximum_length as varchar(10))+')' +' COLLATE Persian_100_CI_AS '
+(case IS_NULLABLE when 'YES' then 'NULL' else 'NOT NULL' end )+';'

FROM   Information_Schema.Columns C
     INNER JOIN Information_Schema.Tables T
          ON  C.Table_Name = T.Table_Name
WHERE  T.Table_Type = 'Base Table'
     AND RTRIM(LTRIM(Collation_Name)) <> RTRIM(LTRIM(@defaultCollation))
 --AND DATA_TYPE='nvarchar'
 AND character_maximum_length>0
ORDER BY
     C.Table_Name,
     C.Column_Name
...