我正在尝试使用difent collations在两个不同的数据库上执行以下查询
select * from sourcedb.DBO.PKtable
except
select * from destinationdb.DBO.PKtable
很明显,两个表都有相同的列和主键
但是在执行时遇到了以下异常
Msg 468,Level 16,State 9,Line 17
无法在EXCEPT操作中解决“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CS_AS”之间的排序规则冲突。
我不能使用COLLATE
关键字因为..我将在运行时使用上述查询,并且表名和列不同,因此无法预测表的列。
我尝试使用以下命令将目标数据库的排序规则更改为与源数据库相同
ALTER DATABASE destinationDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE destinationDB COLLATE <<sourceCollation>>;
ALTER DATABASE destinationDB SET MULTI_USER
排序规则设置为数据库,我可以从sys
表中看到它。
即便如此,当我执行上述查询时,也会出现同样的错误
EDIT1:基本上我正在尝试获取具有相同主键但行中不同的记录。
答案 0 :(得分:1)
另一种可能的解决方法(除了动态sql)可能是使用临时表。 (如果这是一种类型的操作,这可能适合)。
-- create empty #PKTable with required columns and collation.
select * INTO #PKTable from sourcedb.DBO.PKtable where 1=0
-- fill table with data
insert #PKTable select * from destinationdb.DBO.PKtable
-- compare
select * from sourcedb.DBO.PKtable
except
select * from #PKTable
-- remove temp table
drop table #PKTable