如何在 SQL 中更改存储过程的排序规则?
Posted
技术标签:
【中文标题】如何在 SQL 中更改存储过程的排序规则?【英文标题】:How can I change a Stored Procedure's Collation in SQL? 【发布时间】:2016-04-05 11:00:34 【问题描述】:在我的 C# 程序中,当我尝试运行我的一个存储过程时,它给了我一个与排序规则之间的冲突有关的异常。我该如何解决?
错误描述:“无法解决之间的排序规则冲突 "Arabic_CI_AS" 和 "Latin1_General_CI_AS" 中的等于操作。"
【问题讨论】:
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation的可能重复 存储过程没有排序规则,但表列、变量、参数等有。除非您有特殊原因,否则请在整个 SQL Server 实例中使用相同的排序规则。 【参考方案1】:SQL Server 中的排序规则定义了一组用于比较和排序字符串的规则。
在 100 次中有 99 次此特定错误是跨数据库查询的结果,其中连接或 where 条件涉及来自不同数据库中表的“字符串”列(其中一个通常是 tempdb)。
您可以将排序规则指定为查询的一部分,可以是命名排序规则,也可以是 database_default 关键字。请参阅https://msdn.microsoft.com/en-us/library/ms184391.aspx 了解更多信息。
请注意,这实际上会禁用(就这个特定查询而言)动态排序列上的索引(如果存在)。
【讨论】:
【参考方案2】:在创建具有一些 nvarchar 参数的 sp 时,我遇到了同样的错误。这些参数在这个 sp 中被有条件地修改。这是导致与您相同的错误的代码示例:
create procedure a
@name nvarchar(128),
as
if (@name = '')
throw 51000, 'Empty name', 1;
go
这里的解决方案似乎是定义一个排序规则(最好是database_default
):
create procedure a
@name nvarchar(128),
as
if (@name = '' collate database_default)
throw 51000, 'Empty name', 1;
go
【讨论】:
以上是关于如何在 SQL 中更改存储过程的排序规则?的主要内容,如果未能解决你的问题,请参考以下文章