我正在使用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参与,因为我没有权限这样做。
答案 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
不会更改现有列的排序规则,它只会影响新列的默认排序规则。