2010-11-16 9 views
3

Je suis confronté à un problème sur SQL Server 2008 R2 où je dois utiliser une recherche de contenu en ignorant les lettres Umlaute-Lettres allemandes (ä, ö, ü).T-SQL contient la recherche et le tréma en allemand sur SQL Server 2008 R2

Pour tous les développeurs non germanophones: Les lettres Umlaut-Letters allemandes peuvent être représentées comme la lettre sous-jacente régulière (a en utilisant ä) et un e. Donc Müller est le même que Mueller et Bäcker est le même que Baecker. Lorsque vous recherchez "Müller" nous aimerions trouver des informations contenant "Mueller" ainsi que "Müller" et lorsque vous entrez "Mueller" nous aimerions trouver des entrées contenant "Müller" "ainsi que" Mueller ".

Lorsque vous comparez les données avec like ou = vous venez d'ajouter COLLATE German_PhoneBook_CI_AI. Lorsque vous utilisez une recherche de contenu avec un index de texte intégral, ce n'est pas si simple. Vous pouvez désactiver la sensibilité d'accentuation, mais la recherche de contenus traite la lettre ü comme un u, la lettre ä comme un a et la lettre ö comme un o, elle ne trouve pas les entrées contenant oe au lieu de ö, ue au lieu de ü et ae au lieu de ä.

La définition du classement sur la colonne "German_Phonebook_CI_AS" ou "German_Phonebook_100_CI_AS" ne semble pas non plus utile.

Est-ce que quelqu'un a déjà eu le même problème avant?

+0

Pourquoi ne pas mettre à jour la base de données pour exclure les trémas? et utilisez simplement l'orthographe alternative? –

+1

Nous ne pouvons pas simplement mettre à jour la base de données ... nous parlons de noms de personnes ici ... – DrummingCoder

+0

Comment avez-vous résolu ce problème à l'époque? – aggsol

Répondre

-3

Je vous suggère de rechercher à la fois Müller et Mueller occurrences dans ce cas.

+0

Ce n'est pas une option dans notre cas ... Nous devons trouver les deux en une seule requête ... – DrummingCoder

+0

O CON CONTIENT (Nom, 'Müller') OU CONTIENT (Nom, 'Mueller') ou serait-ce un gros problème dans votre question? – liggett78

+1

Oui, car comment géreriez-vous la recherche de 'Cügülü' ou 'Kögeräspensmüller'? – alzaimar

5

Vous devez suivre les étapes suivantes:

  1. Créer le catalogue texte intégral avec la sensibilité à l'accent
  2. Créer l'index de texte intégral spécifiant la langue allemande
  3. utilisation FORMSOF (INFLECTIONAL, yourquery) ' lors de l'interrogation

Voir l'exemple suivant:

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

Ceci est une bonne réponse et la manière recommandée de la résoudre. – alzaimar