我正在使用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 参与进来,因为我没有这样做的权限。
由于您具有具有不同排序规则的值,因此应将它们带到同一排序规则进行比较。一种方法是这样的(决定使用哪种排序规则,并在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
不会更改现有列的排序规则,它只会影响新列的默认排序规则。