如何在 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 中更改存储过程的排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2008 R2 中更改服务器排序规则

Oracle:如何“稍后”运行存储过程

从 SQL 存储过程创建/更改

SQL 存储过程中的动态排序

如何记录存储过程错误

求高人帮忙写一下存储过程