【问题标题】:Collation with union and tempdb使用 union 和 tempdb 进行排序
【发布时间】:2016-01-15 03:23:10
【问题描述】:

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

无法解决“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

如何解决这个问题?

【问题讨论】:

    标签: sql-server tsql collation


    【解决方案1】:

    如果您在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];
    

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

    【讨论】:

      【解决方案2】:

      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-BuildSQL Server 最佳解决方案之一。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多