SQL 除了相交操作之外的服务器重音敏感度排序规则问题

SQL Server accent sensitivity collation issue with except intersect operations

我正在使用 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'

这会产生错误:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the EXCEPT operation.

仅供参考: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 人员参与进来,因为我没有这样做的权限。

由于您的值具有不同的排序规则,因此您应该将它们置于相同的排序规则中进行比较。一种方法是这样的(决定使用哪种排序规则并在 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 不会更改现有列的排序规则,它只会影响新列的默认排序规则。