0

我正在使用 SQL Server 2014 企业版。我从客户那里收到了许多不同的数据库,我需要检查表、列名、数据库之间的记录数。我在使用该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 部门参与进来,因为我没有权限这样做。

4

1 回答 1

2

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

于 2017-05-25T05:27:35.033 回答