使用union和tempdb进行整理

时间:2015-10-16 11:27:58

标签: sql-server tsql collation

我在tempdb中有临时表,在数据库中有一个表。当我用这个2表的联合构造查询时。有一个错误:

  

无法解决“Cyrillic_General_CI_AI”之间的排序规则冲突   UNION操作中的“Cyrillic_General_CI_AS”。

drop table [sysdb].[##temp table];
create table [sysdb].[##temp table](a varchar);
insert into [sysdb].[##temp table] (a) values ('a'),('b');


select grade_name from [mybase].[DDS].[testtable]
union
select * from [sysdb].[##temp table];

我已使用此查询在数据库中测试了我的排序规则参数:

SELECT DATABASEPROPERTYEX('mybase', 'Collation') as collation_dwh,DATABASEPROPERTYEX('tempdb', 'Collation') as collation_tempdb

结果是数据库的整理是相同的:

  

collat​​ion_dwh | collat​​ion_tempdb

     

Cyrillic_General_CI_AI | Cyrillic_General_CI_AI

如何解决此问题?

2 个答案:

答案 0 :(得分:5)

如果您在union中明确设置了排序规则,则应该没问题:

select grade_name collate Cyrillic_General_CI_AI from [mybase].[DDS].[testtable]
union
select a collate Cyrillic_General_CI_AI from [sysdb].[##temp table];

请注意,列可以具有与数据库不同的排序规则。

答案 1 :(得分:1)

在Sql Server中进行整理:

  

排序规则是一组确定数据排序方式的规则   相比较。目前sql有四级排序规则   ( 服务器,数据库,表格和列 )。

整理冲突的原因:

  

您在表格之间的整理级别上遇到了不匹配。

<强>修正:

  

根据Microsoft更改服务器级别排序并不容易   固定。 Source:   在此之前,您需要解决所有列的所有非默认排序规则   SQL Server中的表

DECLARE @DatabaseCollation VARCHAR(100)

SELECT 
    @DatabaseCollation = collation_name 
FROM 
    sys.databases
WHERE 
    database_id = DB_ID()

SELECT 
    @DatabaseCollation 'Default database collation'

SELECT 
    t.Name 'Table Name',
    c.name 'Col Name',
    ty.name 'Type Name',
    c.max_length,
    c.collation_name,
    c.is_nullable
FROM 
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id
INNER JOIN 
    sys.types ty ON c.system_type_id = ty.system_type_id    
WHERE 
    t.is_ms_shipped = 0
    AND 
    c.collation_name <> @DatabaseCollation
  • Re-Build SQL Server是最佳解决方案之一。
  

对于查询以下的临时修复使用。

SELECT grade_name COLLATE DATABASE_DEFAULT from [mybase].[DDS].[testtable]
UNION
SELECT a COLLATE DATABASE_DEFAULT from [sysdb].[##temp table];