如果我在托管数据库的远程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.
答案 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