SQL Server 区分重音排序规则问题,但相交操作除外



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

相关内容

  • 没有找到相关文章

最新更新