【问题标题】:Collation Issue in Stored Procedure存储过程中的排序规则问题
【发布时间】:2016-05-06 11:43:37
【问题描述】:

我收到“无法解决等于操作中“Latin1_General_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。错误。

错误出现在 SP 中,我没有在任何地方指定排序规则,无论是在创建表中还是在我使用时

select t.name, c.*, c.collation_name 
from sys.columns c
left join sys.tables t
on c.object_id = t.object_id
order by c.collation_name 

它说没有“Latin1_General_CI_AS”字段,所有字段都使用默认排序规则。我正在返回一个数据集,但看不到错误在哪里。没有连接。我再次填充一个临时表,但没有指定排序规则,但它说有错误。有什么建议么。使用 SQL Server 2014。

【问题讨论】:

  • 好建议,但我在数据库中没有触发器。
  • “我再次填充临时表,没有指定排序规则” - 如果创建临时表,它将使用 tempdb 中的排序规则,可能不匹配您正在使用的数据库的排序规则。这可能是冲突的原因。尝试运行SELECT collation_name FROM sys.databases WHERE name IN ('tempdb', 'YourDatabase'),看看你是否得到两个不同的排序规则
  • 在我的开发机器上,SP 工作正常,但在生产服务器上却不行。你知道如何找出 SP 使用的是哪一个吗?
  • 嗯,我按照你对 Gaz 的建议做了,确实,我得到了两个排序规则。无论如何解决这个问题?我在共享服务器上,所以可能无法使用。
  • 您可以在过程中创建临时表时显式定义排序规则以避免冲突。或者您可以使用表变量而不是临时表(表变量从当前数据库继承排序规则)。共享服务器上的这些更改中的任何一个都应该没有问题。 This question 解决了类似的问题

标签: sql sql-server


【解决方案1】:

临时表默认使用tempdb 的排序规则,除非在contained database 的上下文中使用。

您可以指定COLLATE DATABASE_DEFAULT 让它使用当前数据库的排序规则。

CREATE TABLE #T
(
SomeColumn VARCHAR(50) COLLATE DATABASE_DEFAULT
)

【讨论】:

  • 我最后就是这么干的。
  • 如何在没有列名的情况下动态创建它(使用 select into)
猜你喜欢
  • 2011-03-02
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2010-11-30
  • 2023-04-04
相关资源
最近更新 更多