我在数据库中创建了2个视图。两者都具有SQL_Latin1_General_CP1_CI_AS的排序规则。视图1从具有相同排序规则的数据库查询数据。 View 2使用排序规则Latin1_General_CI_AS查询数据库中的数据。即使视图显示相同的排序规则,但当我运行以下查询时,我遇到了问题:
Select
V1.ID,
V1.Amount
From V1
Where V1.ID NOT IN
(Select V2.ID
From V2)
这会返回以下错误:
无法解决" Latin1_General_CI_AS"之间的整理冲突 和" SQL_Latin1_General_CP1_CI_AS"在等于操作。
我试图添加" COLLATE SQL_Latin1_General_CP1_CI_AS"到Where语句结束时没有成功。我还尝试在select语句中更改字段级别的排序规则,但没有成功。
如何将此数据与不匹配的排序规则进行比较?
感谢。
答案 0 :(得分:1)
只需在比较数据库之间的字符串时添加显式排序规则,如下所示:
Select
V1.ID,
V1.Amount
From V1
Where V1.ID COLLATE DATABASE_DEFAULT NOT IN
(Select V2.ID COLLATE DATABASE_DEFAULT
From V2)
" DATABASE_DEFAULT"将基本上将字符串强制转换为您正在运行视图的数据库的排序规则。两个排序规则都匹配,比较将成功而不会出错。
请注意,相同的技术对于声明临时表varchar和nvarchar列以及与临时表进行连接非常有用,其中数据库的排序规则可能与安装的SQL Server的排序规则不同(因此也是tempdb的排序规则)。 / p>