排序规则冲突错误,将存储过程的排序规则设置为数据库默认值

问题描述 投票:0回答:2

如何将存储过程的 COLLATION 设置为数据库默认值,而不是该过程中表的单个列。

Cannot resolve the collation conflict between “SQL_Latin1_General_Pref_CP1_CI_AS” and “Latin1_General_CI_AS” in the equal to operation

我收到排序规则冲突错误,因为数据库服务器排序规则与数据库排序规则不同。程序很大,不知道哪个表列发生冲突。

是否可以为存储过程分配排序规则,以便该过程中的所有列都具有相同的排序规则?

sql sql-server collation
2个回答
6
投票

首先,排序规则是关于文本数据如何存储在表中的,而不是存储过程级别的。

当从文本排序规则存储方式不同的源中比较文本数据时,就会出现排序规则问题。 (我不是说文本的数据类型,只是字符串数据)

检查 TSQL where 子句或表连接,这是最常见的文本比较发生的地方。您可以使用比较区域旁边的整理功能来整理到数据库默认值。例如

SELECT
c.CustomerID
FROM
dbo.Customer c
INNER JOIN dbo.CustomerLog cl on c.CustomerName = cl.LogEntry collate     
database_default

根据您的具体情况,这可能是不可能的,但我始终遵循这些规则。
- 在安装时选择正确的服务器默认排序规则,以便在该排序规则下创建临时数据库,当您创建临时表时,这些将在临时数据库中创建
- 创建表时不要指定排序规则,除非有特定原因


0
投票

由于 tempdb 使用默认服务器排序规则而 TestPermTab.Col1 使用不同的排序规则,SQL Server 返回此错误:“无法解决等于操作中 'Latin1_General_CI_AS_KS_WS' 和 'Estonian_CS_AS' 之间的排序规则冲突。”

为了防止出现错误,您可以使用以下替代方法之一:

指定临时表列使用用户数据库的默认排序规则,而不是tempdb。这使得临时表能够与多个数据库中类似格式的表一起使用(如果您的系统需要的话)。

示例: 创建表#TestTempTab (PrimaryKey int 主键, Col1 nchar COLLATE database_default --这就是解决方案。 )

© www.soinside.com 2019 - 2024. All rights reserved.