在 SQL 服务器排序顺序中带有“?”字母的错误排序顺序字符串

Wrong sort order string with "ک" letter in SQL Server sort order

我在 SQL 服务器查询和波斯语中遇到 Order By 的问题。我无法很好地对波斯语文本进行排序。

我使用 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

我们将不胜感激。

您的字段的排序规则可能与您想象的不同。 运行 这个查询是为了查看您的数据库中有什么。他们是 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