T-SQL在SQL Server 2008 R2中包含搜索和德语变音

问题描述:

我在SQL Server 2008 R2上面临一个问题,那就是我必须使用一个包含搜索,而忽略德语Umlaute-Letters(ä,ö,ü)。T-SQL在SQL Server 2008 R2中包含搜索和德语变音

对于所有非德语的开发者: 德语变音符号可以表示为常规基础字母(a使用ä时)和e。所以穆勒和米勒一样,巴克尔和贝克一样。

我们想要做的是这样的: 当搜索“Müller”时,我们希望找到包含“Mueller”和“Müller”的数据,当输入“Mueller”时,我们希望找到包含“Müller “以及”米勒“。

使用like或=来比较数据时,您只需添加COLLATE German_PhoneBook_CI_AI。当使用带有全文索引的包含搜索时,并不那么容易。 您可以将重音敏感度设置为关闭状态,但包含搜索会像u一样处理ü-Letter,像a和ö字母一样处理o,它不会找到包含oe而不是ö的条目,而不是ü和ae而不是ä。

将列上的排序规则设置为“German_Phonebook_CI_AS”或“German_Phonebook_100_CI_AS”似乎也没有帮助。

有没有人有过同样的问题?

+0

为什么不更新数据库以排除变音器?并只使用替代拼写? – 2010-11-16 10:47:37

+1

我们不能简单地更新数据库......我们在这里谈论的是人民的名字...... – DrummingCoder 2010-11-17 16:21:27

+0

当时你是如何解决这个问题的? – aggsol 2017-08-10 09:28:32

我建议你在这种情况下搜索MüllerMueller

+0

这不是我们的选择...我们需要找到两个在一个查询中... – DrummingCoder 2010-11-17 16:21:07

+0

哪里包含(姓氏,'Müller')或包含(姓氏,'米勒')或者这会是一个大问题查询? – liggett78 2010-11-22 15:26:35

+1

是的,因为你将如何处理'Cügülü'或'Kögeräspensmüller'的搜索? – alzaimar 2013-03-13 09:34:07

您应该遵循以下步骤:

  1. 创建全文目录与区分重音
  2. 创建全文索引指定德语
  3. 使用“FORMSOF(INFLECTIONAL,yourquery)”查询

请看下面的例子:

CREATE TABLE MyTable (
    ID int IDENTITY CONSTRAINT PK_MyTable PRIMARY KEY, 
    Txt nvarchar(max) COLLATE German_PhoneBook_100_CI_AI NOT NULL 
) 

INSERT INTO dbo.MyTable 
VALUES (N'Müller'), (N'Mueller'), (N'Muller'), (N'Miller') 

GO 
CREATE FULLTEXT CATALOG FTSCatalog WITH ACCENT_SENSITIVITY=ON AS DEFAULT 
CREATE FULLTEXT INDEX ON MyTable (Txt LANGUAGE German) KEY INDEX PK_MyTable 
GO 
WHILE EXISTS (
    SELECT * FROM sys.dm_fts_index_population 
    WHERE database_id=DB_ID() 
    AND status<>7 
) WAITFOR DELAY '0:0:1' 

GO 
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Müller)') 
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Muller)') 
SELECT * FROM CONTAINSTABLE(dbo.MyTable,Txt,N'FORMSOF(INFLECTIONAL,Mueller)') 

GO 
DROP FULLTEXT INDEX ON MyTable 
DROP FULLTEXT CATALOG FTSCatalog 
GO 
DROP TABLE dbo.MyTable 
+0

这是一个正确的答案和推荐的解决方法。 – alzaimar 2013-03-13 09:34:55