2013-12-12 82 views
24

我正在研究一个视图,其中我在两个不同服务器的两个表上使用内部联接。我们正在使用链接服务器。当运行查询我得到这个消息:如何摆脱SQL Server查询中的排序规则冲突?

无法解析规则“SQL_Latin1_General_CP1_CI_AS”,并在等于操作“Arabic_CI_AS”之间的排序规则冲突。

我对整理不太了解。通过互联网搜索我找到使用COLLATE的解决方案,但COLLATE的概念对我而言并不清楚。它会改变任何数据库的任何东西吗?我正在寻找一个解决方案,而不用更改任何数据库。

这些概念的任何良好的学习材料是值得欢迎的。

+0

你能显示你正在使用的SQL代码吗? –

回答

37

您可以通过强制将查询中使用的排序规则设置为特定排序规则来解决该问题,例如, SQL_Latin1_General_CP1_CI_ASDATABASE_DEFAULT。例如:

SELECT MyColumn 
FROM FirstTable a 
INNER JOIN SecondTable b 
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS 

在上面的查询,a.MyID和b.YourID将与基于文本的数据类型列中。使用COLLATE将强制查询忽略数据库上的默认排序规则,而是使用提供的排序规则,在本例中为SQL_Latin1_General_CP1_CI_AS

基本上什么是怎么回事是每个数据库都有自己归类它“提供了排序规则,案例,并为您的数据区分重音属性”(从http://technet.microsoft.com/en-us/library/ms143726.aspx,适用于列与文本的数据类型,例如VARCHARCHAR,NVARCHAR等。当两个数据库有不同的排序规则时,无法解决两个不同排序规则之间的冲突时,无法将文本列与像equals(=)这样的运算符进行比较。

+0

谢谢Roryap。我正在使用COLLATE更新我的代码。如果有任何问题,我会通知你。所以这意味着在数据库级别上什么都不会改变,并且这个COLLATE只会在SQL脚本中完成。 – elmo

+0

谢谢,它的工作。我的问题已解决。 – elmo

+0

有趣的是,到目前为止,我还以为我必须改变数据库级别的排序规则来使em匹配,不知道我可以使用'COLLATE'在我的查询中匹配em!谢谢你救了我很多麻烦。 – Niklas

3

我解决了类似的问题,通过包装在另一个查询的查询......

初始查询正在努力寻找让输出的各列,与一些从Max或Sum函数子查询来列,并其他与“独特”或案例替换等。

我遇到的整理错误试图创建与输出的单场之后...

select 
rtrim(field1)+','+rtrim(field2)+','+... 

,因为我写的查询将执行,但节省了SQL和重装之后会发生错误。

彼时的东西,如固定它...

select z.field1+','+z.field2+','+... as OUTPUT_REC 
from (select rtrim(field1), rtrim(field2), ...) z 

某些字段是一个子查询的“最大”,具有替代的情况下,如果空等是日期字段,还有一些是左联接(威力为NULL)...换句话说,混合字段类型。我认为这是由操作系统整理和数据库整理引起的问题的原因略有不同,但通过在最终选择之前将所有的字符串转换为修剪过的字符串,它将它排序,全部在SQL中。