SQL Server:忽略设置为不敏感的排序规则

时间:2014-04-25 06:10:54

标签: sql sql-server collation

我的数据库包含表'Product',列'Name'。我需要实现大小写和重音不敏感的搜索,所以我尝试更改列的排序规则,如下所示:

EXEC sp_fulltext_column @tabname = 'Product' , @colname = 'Name', @action = 'drop' 

ALTER TABLE dbo.Product
ALTER COLUMN Name nvarchar(400) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL;

EXEC sp_fulltext_column @tabname = 'Product' , @colname = 'Name', @action = 'add'

然后我检查了列的整理,如下所示:

SELECT collation_name  FROM sys.columns 
WHERE name = 'name' AND object_id = (select object_id from sys.tables where name = 'Product');

并且正确地将排序规则设置为CI和AI(SQL_Latin1_General_CP1_CI_AI)。

我在数据库中测试产品的名称如'Čučoriedka','Čúčo','Test'。 我想通过查询选择'Čučoriedka'和'Čúčo':

select * from product where CONTAINS([Name], 'cuc')

但是'test'都没有使用这些查询:

select * from product where CONTAINS([Name], 'tes')
select * from product where PATINDEX('tes', [Name] COLLATE SQL_Latin1_General_CP1_CI_AI ) > 0 

我还尝试了另一种排序规则,但没有任何效果。

你知道这有什么用吗?

非常感谢!马立克

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!我发现,整理只对订购有影响。我正在使用全文搜索,所以我需要更改全文索引。如果其他人需要这样做,我就是这样做的。

IF EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id('Product'))
DROP FULLTEXT INDEX ON [Product]

DECLARE @create_index_text nvarchar(4000)
SET @create_index_text = '
  IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Product]''))
  ALTER FULLTEXT INDEX ON [Product]([Name]  Language 1051, [ShortDescription]  Language 1051, [FullDescription]  Language 1051, [Sku]  Language 1051)
  KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Product') +  '] ON [nopCommerceFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)

ALTER FULLTEXT CATALOG nopCommerceFullTextCatalog REBUILD WITH ACCENT_SENSITIVITY=OFF;

语言代码1051适用于斯洛伐克语,您可以在此处找到您的代码:http://technet.microsoft.com/en-us/library/ms176076.aspx

希望它有所帮助!