设置或更改列排序规则

可以通过为表的特定列指定不同的排序规则并使用下列项之一来替代数据库排序规则charnvarcharvarcharnchartextntext

  • CREATE TABLEALTER TABLE 的 COLLATE 子句。 例如:

    CREATE TABLE dbo.MyTable  
      (PrimaryKey   int PRIMARY KEY,  
       CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  
      );  
    GO  
    ALTER TABLE dbo.MyTable ALTER COLUMN CharCol  
                varchar(10)COLLATE Latin1_General_CI_AS NOT NULL;  
    GO  
    
  • SQL Server Management Studio。 有关 排序规则和 Unicode 支持 的详细信息。

  • 在 SQL Server 管理对象(SMO)中使用 Column.Collation 属性。

不能更改当前由下列任一项引用的列的排序规则:

  • 计算列

  • 索引

  • 分布统计信息(自动生成或由 CREATE STATISTICS 语句生成)

  • CHECK 约束

  • 外键约束

使用tempdb时,COLLATE子句包含database_default选项,该选项用于指定临时表中的列使用当前用户数据库连接的排序规则默认值,而不是tempdb的排序规则。

排序规则和文本列

可以在某列中插入或更新值,该列的排序规则与数据库默认排序规则的代码页不同 text 。 SQL Server 将值隐式转换为列的排序规则。

排序规则和 tempdb

每次启动 SQL Server 时,都会重新创建 tempdb 数据库,并且其默认排序规则与 模型 数据库相同。 这通常与实例的默认排序规则相同。 如果创建用户数据库并指定与 模型不同的默认排序规则,则用户数据库的默认排序规则不同于 tempdb。 所有临时存储过程或临时表都创建并存储在 tempdb 中。 这意味着临时表中的所有隐式列以及临时存储过程中的所有可强制默认常量、变量和参数都具有与永久表和存储过程中创建的可比较对象不同的排序规则。

这可能会导致用户定义的数据库和系统数据库对象之间的排序规则不匹配的问题。 例如,SQL Server 实例使用 Latin1_General_CS_AS 排序规则,并执行以下语句:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

在此系统中,tempdb数据库使用代码页1252的Latin1_General_CS_AS排序规则,而TestDBTestPermTab.Col1则使用代码页1257的Estonian_CS_AS排序规则。 例如:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

在前面的示例中,tempdb 数据库使用 Latin1_General_CS_AS 排序规则,而 TestDBTestTab.Col1 使用 Estonian_CS_AS 排序规则。 例如:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

由于tempdb使用默认服务器排序规则,而TestPermTab.Col1使用不同的排序规则,SQL Server 返回此错误:“在等式操作中无法解决 'Latin1_General_CI_AS_KS_WS' 和 'Estonian_CS_AS' 之间的排序规则冲突。”

若要防止此错误,可以使用以下替代方法之一:

  • 指定临时表列使用用户数据库的默认排序规则,而不是 tempdb。 这使临时表能够处理多个数据库中类似格式的表(如果需要)。

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • 指定 #TestTempTab 列的正确排序规则:

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

另请参阅

设置或更改服务器排序规则
设置或更改数据库排序规则
排序规则和 Unicode 支持