【问题标题】:SQL Server accent sensitivity collation issue with except intersect operationsSQL Server 重音敏感性排序规则问题,除了相交操作
【发布时间】:2017-10-25 14:17:57
【问题描述】:

我使用的是 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'

这会产生错误:

无法解决 EXCEPT 操作中“SQL_Latin1_General_CP1_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

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

【问题讨论】:

  • 明白了,谢谢marc_s

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


【解决方案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 不会更改现有列的排序规则,它只会影响新列的默认排序规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 2019-03-07
    • 1970-01-01
    • 2013-01-09
    • 2010-10-25
    • 1970-01-01
    • 2013-01-21
    • 2011-11-04
    相关资源
    最近更新 更多