排序问题MSSQL

时间:2012-05-04 07:53:06

标签: sql sql-server tsql

所以,我正在尝试做一些非常简单的事情;更改表并添加外键约束。问题是它给我一个错误,关于列的排序规则不匹配:

列blah与外键中的列blah引用的排序方式不同。

我不明白这一点,我到处都看。当我查看SQL属性页面时,它显示相同的排序规则(Latin1_General_CI_AS)。我到处寻找,我不知道如何改变这一点。任何可以帮助的人都将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:6)

尝试比较SQL Server中的两个字符串时,排序规则必须匹配,否则会出现此错误。排序规则告诉SQL Server如何比较字符串(即CHAR,NCHAR,VARCHAR,NVARCHAR)。排序规则Latin1_General_CI_AS使用Latin1_General字符集,不区分大小写,区分重音。

在我给你解决方案之前你需要知道的一些事情:SQL Server中有三个级别的排序规则:

  1. 服务器默认排序规则:这是在SQL Server安装期间设置的,它定义用于在服务器上创建的新数据库的默认排序规则。这也是用于系统数据库的默认排序规则,包括TempDB。换句话说,如果创建临时表而未指定要使用的排序规则,则它将使用服务器的默认值。您可以通过右键单击服务器并选择属性来找到它。
  2. 数据库默认排序规则。这是在数据库中创建表时将使用的排序规则,而不是在创建表时显式指定排序规则。默认情况下,这与服务器的排序规则相同,但可以在创建数据库时指定。如果备份数据库并在具有不同排序规则的其他服务器上将其还原,则它将保留自己的排序规则,而不是继承服务器的排序规则。您可以通过右键单击数据库并选择属性来查看。
  3. 现场整理。这是特定字段的排序规则,对于数据库中的所有字符串类型字段都存在。如果更改数据库的排序规则,则不会更改数据库中所有字符串字段的排序规则;只有随后在数据库上创建的字段。您可以使用sp_help TableName在表设计器中查看此排序规则,或右键单击该字段并选择属性。
  4. 为了解决您的问题,您需要更改您要比较的两个字段之一的整理,以使它们相同。更改两者以匹配数据库的排序规则可能是您的最佳做法:

    ALTER TABLE MyMaster ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS
    ALTER TABLE MyDetail ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS
    

    然后你就可以定义外键了:

    ALTER TABLE MyDetail ADD CONSTRAINT FK_Master_Detail FOREIGN KEY (MyMasterKey) REFERENCES MyMaster(MyMasterKey)
    

答案 1 :(得分:1)

好像两个表或两个字段(外键 - 主键)具有不同的排序规则。你能给我们一些更多信息吗?

  1. 您能确认数据库中的排序规则吗?
  2. 您能确认外键字段的排序规则以及引用表格上的主键吗?
  3. 您是否在任何地方使用临时表?临时表采用sql实例的排序规则。如果使用其他排序规则创建数据库,则可能会出现此问题。
  4. 请参阅此帖子,了解如何检查排序规则:SQL Authority Blogpost