Questo problema può essere risolto utilizzando regole di confronto insensibili all'accento .
Il tuo database sta probabilmente utilizzando un confronto AS (Accent Sensitive), quindi per impostazione predefinita cercherà la corrispondenza esatta, inclusi gli accenti.
È possibile indicare alla clausola WHERE di utilizzare un altro confronto rispetto all'impostazione predefinita del database specificando un confronto con il confronto.
In questo dbfiddle ho creato un esempio usando le regole di confronto LATIN1 ma potresti usare lo stesso approccio con le regole di confronto che stai utilizzando semplicemente cambiando AS in AI per le regole di confronto attualmente utilizzate dalla tua colonna.
Utilizzare le regole di confronto insensibili all'accento che corrispondono alle regole di confronto utilizzate dalla colonna. Ad esempio, se la colonna sta usando SQL_Latin1_General_CP1_CI_AS
, usa SQL_Latin1_General_CP1_CI_AI
e non Latin1_General_CI_AS
o Latin1_General_100_CI_AS
o nessuna delle varianti di quei due poiché il comportamento delle regole di confronto non SQL_ differirà in più modi rispetto alla semplice insensibilità all'accento e ciò potrebbe non essere previsto dagli utenti.
Puoi controllare le regole di confronto correnti in sys.columns
.
CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';
-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI
--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS
Leggi tramite Utilizzo delle regole di confronto di SQL Server per ulteriori informazioni.
Quindi, probabilmente vorrai che l'ordinamento utilizzi questa raccolta (come notato da peufeu nei commenti) per assicurarti che "é" sia ordinato con "e". Altrimenti, qualcuno che impagina i risultati in ordine alfabetico sarebbe sorpreso di non trovare "é" dove si aspettano che si trovino, ma se vuoi solo toccare questa query puoi aggiungere anche la COLLATE
clausola ORDER BY
.
Come osservato da Solomon Rutzky nei commenti, se ciò riguarda solo 1 o alcune colonne, un'altra opzione è quella di creare una colonna calcolata non persistente che semplicemente ripete la colonna "nome" e fornisca l'accento insensibile fascicolazione, quindi indicizza il calcolo colonna. Ciò evita la scansione causata dalla modifica delle regole di confronto all'interno della query. Quindi la query deve filtrare sulla nuova colonna.
Qualcosa di simile a:
ALTER TABLE
dbo.[table_name] ADD [SearchName] datatype_of_name_column
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI));
CREATE INDEX [IX_table_name_SearchName]
ON dbo.[table_name] ([SearchName] ASC);
Oppure potresti anche creare una vista invece di aggiungere una colonna calcolata (come preferisce jyao ).