除交叉操作之外的SQL Server重音敏感度排序问题

时间:2017-05-25 03:40:55

标签: sql-server sql-server-2014 collation except accent-sensitive

我正在使用SQL Server 2014 Enterprise。我从客户端收到了许多不同的数据库,我需要检查表,列名,数据库之间的记录数。使用Except函数时,我遇到了排序规则问题:

SELECT c.name "ColumnName"
FROM [DB1].sys.tables t
INNER JOIN [DB1].sys.all_columns c ON t.object_id = c.object_id
INNER JOIN [DB1].sys.types ty ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test'

EXCEPT

SELECT  c.name
FROM [DB2].sys.tables t
INNER JOIN [DB2].sys.all_columns c ON t.object_id = c.object_id
INNER JOIN [DB2].sys.types ty ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test2'

这会产生错误:

  

无法解决" SQL_Latin1_General_CP1_CI_AI"之间的整理冲突和" SQL_Latin1_General_CP1_CI_AS"在EXCEPT操作中。

仅供参考:DB1是" SQL_Latin1_General_CP1_CI_AI",DB2是" SQL_Latin1_General_CP1_CI_AS"

这可以通过像我这样的查询中的COLLATE函数来解决吗?如果是这样,怎么样?

另外,我在网上找到了以下内容:

USE master;
GO

ALTER DATABASE [DB2]
COLLATE SQL_Latin1_General_CP1_CI_AI ;
GO

我必须让我们的IT参与,因为我没有权限这样做。

1 个答案:

答案 0 :(得分:1)

由于您具有不同排序规则的值,因此应将它们用于相同的排序规则以进行比较。一种方法就是这样(决定使用哪种排序规则并在EXCEPT的两个部分使用相同的排序规则):

SELECT  c.name COLLATE SQL_Latin1_General_CP1_CI_AS AS ColumnName
FROM 
    [DB1].sys.tables t
    INNER JOIN [DB1].sys.all_columns c ON t.object_id = c.object_id
    INNER JOIN [DB1].sys.types ty ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test'

EXCEPT

SELECT  c.name COLLATE SQL_Latin1_General_CP1_CI_AS
FROM 
    [DB2].sys.tables t
    INNER JOIN [DB2].sys.all_columns c ON t.object_id = c.object_id
    INNER JOIN [DB2].sys.types ty ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test2'

更改整个数据库(ALTER DATABASE [DB2] COLLATE SQL_Latin1_General_CP1_CI_AI;)的排序规则无济于事,因为ALTER DATABASE不会更改现有列的排序规则,它只会影响新列的默认排序规则。