将 COLLATE 与 UNION 结合使用

Anj*_*nja 7 sql-server collation t-sql union

怎么COLLATEUNION?我想合并 2 个表(都具有相同的列和相同的类型:)varchar,int, int, decimal

我收到以下错误:

sg 468, Level 16, State 9, Line 1 无法解决 UNION 操作中“Serbian_Latin_100_CI_AS”和“Croatian_CI_AS”之间的排序冲突。

我的 SQL 语句:

select * from #IA_BIH
union 
select * from #IA_MNE  
Run Code Online (Sandbox Code Playgroud)

我应该在哪里插入collate database_default?我尝试了不同的组合,但没有奏效。

RLF*_*RLF 5

根据排序规则名称,我假设您使用的是 Microsoft SQL Server。

COLLATE 可用于数据库级别或列级别。由于您正在尝试 UNION 两个表,因此在所需列上使用列排序规则将解决您的查询。

这是一个示例代码,可以帮助您:

use testdb
GO
CREATE TABLE dbo.Serbian  (Name VARCHAR(20) COLLATE Serbian_Latin_100_CI_AS);
CREATE TABLE dbo.Croatian (Name VARCHAR(20) COLLATE  Croatian_CI_AS);
GO
INSERT INTO dbo.Serbian VALUES ('serbian');
INSERT INTO dbo.Croatian VALUES ('croation');
GO

-- Collate to a particular named collation
SELECT Name COLLATE Serbian_Latin_100_CI_AS as CollatedNameSerbian from dbo.Serbian 
UNION ALL
SELECT Name COLLATE Serbian_Latin_100_CI_AS from dbo.Croatian 
GO
-- Collate to the database default collation
SELECT Name  COLLATE database_default as CollatedNameDBDefault from dbo.Serbian 
UNION ALL
SELECT Name COLLATE database_default from dbo.Croatian 
GO

DROP TABLE dbo.Serbian;
DROP TABLE dbo.Croatian;
GO
Run Code Online (Sandbox Code Playgroud)

当然,如果您有几个具有冲突排序规则的列,您还需要定义它们的排序规则。