Обновлено Anwer (20120212):
Хотя мой ответ ниже будет работать, и учитывая, что T- SQL TRANSLATE особенно быстр, то, что было опубликовано, и ответ Дэвида выше, будут работать намного лучше.
Стоит отметить (я только что узнал), что и Cyrillic_General_CI_AI
, и Greek_CI_AI
также работают. Это полезно знать, потому что некоторые параметры сортировки работают лучше, чем другие, поэтому это хорошо для тестирования.
Предыдущий ответ
Вы не упомянули, какую версию SQL Server вы используете.
Если вы используете SQL Сервер 2017 +
Тогда вы можете использовать ПЕРЕВОД примерно так:
DECLARE @string VARCHAR(100) = 'Thë Quìck Grééñ Fox Jumps ôver The Lázy Dög.';
SELECT NewString = TRANSLATE(@string,accents.C,clean.C)
FROM (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C);
Возвращает: Быстрый зеленый лис перепрыгивает через Ленивую собаку.
Если вы используете более раннюю версию SQL
Для этого Вы можете использовать NGrams8K , чтобы создать свою собственную функцию ПЕРЕВОДА, которую я включил в конце этого поста.
SELECT t.NewString
FROM (VALUES('áÁâÂäÄãÃàÀéÉêÊëËèÈíÍîÎïÏìÌóÓôÔöÖõÕòÒúÚûÛüÜùÙýÝñÑçÇ')) AS accents(C)
CROSS APPLY (VALUES('aAaAaAaAaAeEeEeEeEiIiIiIiIoOoOoOoOoOuUuUuUuUyYnNcC')) AS clean(C)
CROSS APPLY samd.translate8K(@string,accents.C,clean.C) AS t;
Вот код, который я использовал для генерации строки символов ударения:
SELECT CONCAT(
CHAR(225),CHAR(193),CHAR(226),CHAR(194),CHAR(228),CHAR(196),CHAR(227),CHAR(195),CHAR(224),CHAR(192), -- a(10)
CHAR(233),CHAR(201),CHAR(234),CHAR(202),CHAR(235),CHAR(203),CHAR(232),CHAR(200), -- e(8)
CHAR(237),CHAR(205),CHAR(238),CHAR(206),CHAR(239),CHAR(207),CHAR(236),CHAR(204), -- i(8)
CHAR(243),CHAR(211),CHAR(244),CHAR(212),CHAR(246),CHAR(214),CHAR(245),CHAR(213),CHAR(242),CHAR(210), -- o(10)
CHAR(250),CHAR(218),CHAR(251),CHAR(219),CHAR(252),CHAR(220),CHAR(249),CHAR(217), -- u(8)
CHAR(253),CHAR(221),CHAR(241),CHAR(209),CHAR(231),CHAR(199)) -- y(2),n(2),c(2)
Функция пользовательского перевода:
CREATE FUNCTION samd.translate8K
(
@inputString VARCHAR(8000),
@characters VARCHAR(8000),
@translations VARCHAR(8000)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
/*****************************************************************************************
[Purpose]: Custom version of SQL Server 2017 Translate
-- Masking possible PII
DECLARE @inputstring VARCHAR(8000) =
'I don''t know if you got my SSN but it''s 555-90-5511. Call me at 312.800.5555';
SELECT t.newstring
FROM samd.translate8K(@inputString, '0123456789', REPLICATE('#',10)) AS t;
[Revision History]:
------------------------------------------------------------------------------------------
Rev 00 - 20180725 - Initial Development - Alan Burstein
****************************************************************************************/
SELECT newstring =
(
SELECT CASE WHEN c.chr>c.tx THEN '' WHEN c.chr>0 THEN t.chr ELSE ng.token END+''
FROM samd.NGrams8k(@inputString,1) AS ng
CROSS APPLY (VALUES(CHARINDEX(ng.token, @characters),LEN(@translations))) AS c(chr,tx)
CROSS APPLY (VALUES(SUBSTRING(@translations,c.chr,1))) AS t(chr)
ORDER BY ng.position
FOR XML PATH(''), TYPE
).value('text()[1]', 'varchar(8000)');
GO
https://emw3.com/unicode-accents.html