视图的排序问题

时间:2017-04-24 19:39:01

标签: sql-server sql-server-2012

我在数据库中创建了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语句中更改字段级别的排序规则,但没有成功。

如何将此数据与不匹配的排序规则进行比较?

感谢。

1 个答案:

答案 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>