使用TSQL,CAST()与COLLATE是不确定的。如何确定它?什么是解决方法?

时间:2013-10-02 02:19:13

标签: tsql sql-server-2012 azure-sql-database non-deterministic

我的功能包括:

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。

2 个答案:

答案 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')