Collat​​ion Conflict错误在本地sql上工作而不在服务器托管数据库上

时间:2013-10-31 09:25:49

标签: sql sql-server tsql

如果我在托管数据库的远程sql服务器上运行相同的t-sql,我有t-sql在本地sql服务器上工作正常

我尝试了很多改动,但没有什么对我有用,最后我决定在Stack Exchange上写。

我使用来自服务器的脚本创建了我的本地数据库,所以我希望他们的任何数据类型都没有变化,因为我的查询给了我正确的结果。

这是我的t-sql

IF OBJECT_ID('tempdb..#TempAppliedData') IS NOT NULL  
  BEGIN  
        DROP TABLE #TempAppliedData  
  END  

Create Table #TempAppliedData(
--RecordNo [int],
IdNo1 [nvarchar](50) COLLATE DATABASE_DEFAULT,
--Name [nvarchar](50),
AYear2011 [char](3) COLLATE DATABASE_DEFAULT,
AYear2012 [char](3) COLLATE DATABASE_DEFAULT,
AYear20121 [char](3) COLLATE DATABASE_DEFAULT, 
AYear2013 [char](3) COLLATE DATABASE_DEFAULT,
AYear20131 [char](3) COLLATE DATABASE_DEFAULT
);


insert into #TempAppliedData (IdNo1) select distinct  IdNo from AppliedData


update #TempAppliedData 
set 
AYear2011=(select CASE WHEN COUNT(A.Year2011)=0 then 'No' else 'YES' end FROM AppliedData A WHERE Year2011='Yes' and IdNo1=IdNo) ;


update #TempAppliedData 
set 
AYear2012=(select CASE WHEN COUNT(A.Year2012)=0 then 'No' else 'YES' end FROM AppliedData A WHERE ApplnYear <=20131 AND Year2012='Yes' and IdNo1=IdNo)


update #TempAppliedData 
set 
AYear20121=(Select CASE WHEN COUNT(A.Year20121)=0 then 'No' else 'YES' end FROM AppliedData A WHERE ApplnYear <=20131 AND Year20121='Yes' and IdNo1=IdNo)



update #TempAppliedData 
set 
AYear2013=(Select CASE WHEN COUNT(A.Year2013)=0 then 'No' else 'YES' end FROM AppliedData A WHERE ApplnYear <=20131  AND Year2013='Yes' and IdNo1=IdNo)


update #TempAppliedData 
set 
AYear20131=(Select CASE WHEN COUNT(A.Year20131)=0 then 'No' else 'YES' end FROM AppliedData A WHERE ApplnYear <=20131  AND Year20131='Yes' and IdNo1=IdNo)




Select * from #TempAppliedData;

--select distinct IdNo from AppliedData

产生的错误如下:

Msg 468, Level 16, State 9, Line 28
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Msg 468, Level 16, State 9, Line 40
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Msg 468, Level 16, State 9, Line 53
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Msg 468, Level 16, State 9, Line 66
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Msg 468, Level 16, State 9, Line 79
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

3 个答案:

答案 0 :(得分:0)

只需在错误COLLATE SQL_Latin1_General_CP1_CS_AS

之后添加值

答案 1 :(得分:0)

似乎你对列IdNo1和IdNo有不同的排序规则(你应该使用别名,以便人们知道列所属的位置)

update B 
set AYear2011 =
case when exists (
select 1
FROM AppliedData A 
WHERE A.Year2011='Yes' and B.IdNo1=A.IdNo collate SQL_Latin1_General_CP1_CI_AS) 
) then 'Yes' else 'No' End
-- or this: collate SQL_Latin1_General_CP1_CS_AS
from #TempAppliedData B

注意大的变化,否则AYear2011的价值永远不会是'否'

答案 2 :(得分:0)

Create Table #TempAppliedData(
 IdNo1 [nvarchar](50) COLLATE DATABASE_DEFAULT,

您在此处创建的列具有托管tempdb的默认排序规则。显然,您自己的数据库使用CI排序规则,而托管服务则使用CS排序规则进行部署。

在脚本中使用显式排序规则,而不是依赖现有的部署排序规则。理想情况下,您应始终在相同的设置下进行开发。 ansyou