我有一个函数,它包括:
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。
但是使用COLLATE会使函数变得不确定,因此我不能将其用作列中的计算持久化值。
Q1。有没有另一种(快速而简单的)方法来消除像这样的重音,使用确定性函数?
Q2。(额外的问题)我做这个计算持久列的原因是为了搜索。例如,用户可以输入客户的姓氏'Gagne‘或'Gagné’或'GAGNE‘或’GAGNé‘,应用程序将使用持久化计算列找到它。有没有更好的方法来做这件事?
编辑:使用SQL Server 2012和SQL-Azure。
发布于 2013-10-03 08:22:55
你会发现它实际上是确定性的,它只是根据你试图整理的字符而有不同的行为。
检查page for Windows 1251 encoding中可接受字符和不可接受字符的行为。
Here is a collation chart for Cyrillic_General_CI_AI。这是代码页1251,不区分大小写和重音。这将向您显示此归类中所有可接受字符的映射。
至于搜索问题,正如Keith所说,我将研究在您要搜索的列上放置全文索引。
发布于 2013-10-04 12:15:06
我得到的最好的答案是Sebastian Sajaroff。我用他的例子解决了这个问题。他建议使用具有唯一索引的视图。这为解决方案提供了一个很好的想法:
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')https://stackoverflow.com/questions/19129021
复制相似问题