使用除SQL Server之外的排序规则冲突

时间:2015-09-29 06:00:33

标签: database sql-server-2008 tsql plsql collation

我正在尝试使用difent collat​​ions在两个不同的数据库上执行以下查询

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:基本上我正在尝试获取具有相同主键但行中不同的记录。

1 个答案:

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