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
不会更改现有列的排序规则,它只会影响新列的默认排序规则。
我正在使用 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
不会更改现有列的排序规则,它只会影响新列的默认排序规则。