排序问题MSSQL

Jac*_*ack 0 sql t-sql sql-server

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

列blah与外键中的列blah引用的排序不一样.

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

Pet*_*ter 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在表设计器中查看此排序规则,或右键单击该字段并选择属性.

为了解决您的问题,您需要更改您要比较的两个字段之一的排序规则,以使它们相同.更改两者以匹配数据库的排序规则可能是您的最佳做法:

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
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE MyDetail ADD CONSTRAINT FK_Master_Detail FOREIGN KEY (MyMasterKey) REFERENCES MyMaster(MyMasterKey)
Run Code Online (Sandbox Code Playgroud)