我的功能包括:
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。
答案 0 :(得分:1)
你会发现它实际上是确定性的,它根据你试图整理的角色而有不同的行为。
检查page for Windows 1251 encoding对已接受字符的行为和不可接受的字符。
Here is a collation chart for Cyrillic_General_CI_AI。这是代码页1251 Case Insensitive和Accent Insensitive。这将显示此归类中所有可接受字符的映射。
至于搜索问题,正如Keith所说,我会调查在你要搜索的列上放一个全文索引。
答案 1 :(得分:1)
我得到的最佳答案来自Sebastian Sajaroff。我用他的例子来解决这个问题。他建议使用具有独特索引的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')