6

我有一个功能,包括:

SELECT @pString = CAST(@pString AS VARCHAR(255)) COLLATE SQL_Latin1_General_Cp1251_CS_AS

例如,这对于删除法语中的重音很有用;例如:

UPPER(CAST('Éléctricité' AS VARCHAR(255)) COLLATE SQL_Latin1_General_Cp1251_CS_AS)

ELECTRICITE.

但是 usingCOLLATE使函数具有不确定性,因此我不能将其用作列中的计算持久值。

Q1。是否有另一种(快速而简单)的方法来删除这样的重音,具有确定性功能?

Q2。(奖励问题)我做这个计算持久列的原因是搜索。例如,用户可以将客户的姓氏输入为“Gagne”或“Gagné”或“GAGNE”或“GAGNÉ”,应用程序将使用持久计算列找到它。有一个更好的方法吗?

编辑:使用 SQL Server 2012 和 SQL-Azure。

4

2 回答 2

1

我得到的最佳答案来自Sebastian Sajaroff。我用他的例子来解决这个问题。他建议使用 UNIQUE INDEX 的 VIEW。这给出了解决方案的一个好主意:

create table Test(Id int primary key, Name varchar(20))
create view TestCIAI with schemabinding as
select ID, Name collate SQL_Latin1_General_CP1_CI_AI as NameCIAI from Test 
create unique clustered index ix_Unique on TestCIAI (Id)
create unique nonclustered index ix_DistinctNames on TestCIAI (NameCIAI)
insert into Test values (1, 'Sébastien')
--Insertion 2 will fail because of the unique nonclustered indexed on the view 
--(which is case-insensitive, accent-insensitive)
insert into Test values (2, 'Sebastien')
于 2013-10-04T04:15:06.240 回答
1

您会发现它实际上是确定性的,它只是根据您要整理的角色而具有不同的行为。

检查Windows 1251 编码页面,了解可接受字符和不可接受字符的行为。

这是 Cyrillic_General_CI_AI 的整理图表。这是代码页 1251 不区分大小写和不区分重音。这将向您显示此排序规则中所有可接受字符的映射。

至于搜索问题,正如基思所说,我会调查在您要搜索的列上放置一个全文索引。

于 2013-10-03T00:22:54.667 回答