Sql Server - 使用排序规则

Posted

技术标签:

【中文标题】Sql Server - 使用排序规则【英文标题】:Sql Server - Using Collation 【发布时间】:2012-06-08 11:03:48 【问题描述】:

我正在使用以下查询,我需要在其中指定排序规则提示以避免跨数据库的排序规则问题,因为此查询使用来自 2 个数据库的表。

消息 468,级别 16,状态 9,第 12 行无法解析排序规则 “Latin1_General_CS_AI”和“Latin1_General_CS_AS”之间的冲突 等于运算。

目前,当我运行一些使用具有不同排序规则的不同数据库的查询时,出现排序规则冲突的错误:

Delete from table1 where oldcolumn in
(
select newcolumn from Database2.dbo.table2
where invoiceid = @invno
and complete = 0
)

我将查询更改为包含如下排序提示:

Delete from table1 where oldcolumn COLLATE SQL_Latin1_General_CP1_CS_AS in
(
select newcolumn from Database2.dbo.table2
where invoiceid = @invno
and complete = 0
)
    以上查询能解决排序问题吗? 在运算符(例如“=”运算符)的左侧或右侧指定整理提示是否相同? 像invoiceid = @invno 这样的查询是否会产生运行时排序冲突?

注意:我问这个问题是因为我无权访问上述 2 个数据库中的任何一个,并且脚本将在实际数据库上运行。

【问题讨论】:

您忘记描述您现在遇到的“排序规则问题”。您收到错误消息、错误结果还是什么? 我收到排序规则冲突的运行时错误。我已经更新了问题。 你忘记发布错误信息了。 哪个列有哪个排序规则?当newcolumn = 'résumé'table2 返回时,是否需要删除oldcolumn = 'resume',反之亦然? 请不要随心所欲。我现在只关心运行时错误。 【参考方案1】:

使用下面的查询:

DELETE FROM Table1
WHERE Table1.ID IN (
                SELECT Table1.ID
                FROM Table1
                INNER JOIN Database2.dbo.Table2 Table2 ON Table2.NewColumn = Table1.OldColumn COLLATE SQL_Latin1_General_CP1_CS_AS
                WHERE   Table2.invoiceid = @invno
                    AND Table2.complete = 0
                )

【讨论】:

以上是关于Sql Server - 使用排序规则的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server - 使用排序规则

SQL Server 2005 排序规则问题

SQL Server 中索引的排序规则

SQL Server 不区分大小写的排序规则

如何选择 SQL Server 数据库的排序规则

SQL server中如何更改排序规则