【问题标题】:Collation conflict ERROR ,Set collation for stored procedure as database default排序规则冲突错误,将存储过程的排序规则设置为数据库默认值
【发布时间】:2012-11-20 13:34:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为这样的 cmets 不会对您的事业有所帮助。我也不相信您能够在连接范围内做到这一点。我认为您最好的选择是在系统表上运行查询以尝试找出哪些列包含该排序规则,并使用这些查询结果来查看您是否可以看到任何似乎可能在您的存储过程中使用的内容。
  • 抱歉我已经删除了那条评论
  • 没有问题。尝试以下类似的方法,看看它是否可以缩小您的问题范围; SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLLATION_NAME = 'SQL_Latin1_General_Pref_CP1_CI_AS'
  • 使用临时表时要小心,您希望它们与您正在使用的数据库具有相同的排序规则。临时表使用数据库的服务器默认排序规则。创建临时表时显式设置排序规则。创建表#TestTempTab(PrimaryKey int PRIMARY KEY,Col1 nchar COLLATE Estonian_CS_AS)。见msdn.microsoft.com/en-us/library/ms190920(v=sql.100).aspx
  • @Daniel Cabral 这是你提供给我的一些非常重要的信息,我现在会小心临时表..非常感谢先生..

标签: sql sql-server collation


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2012-08-24
    • 2023-04-04
    • 1970-01-01
    • 2021-11-26
    • 2018-08-02
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多