我在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
结果是数据库的整理是相同的:
collation_dwh | collation_tempdb
Cyrillic_General_CI_AI | Cyrillic_General_CI_AI
如何解决此问题?
答案 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
对于查询以下的临时修复使用。
SELECT grade_name COLLATE DATABASE_DEFAULT from [mybase].[DDS].[testtable]
UNION
SELECT a COLLATE DATABASE_DEFAULT from [sysdb].[##temp table];