2012-06-23 3 views
1

Я хочу, чтобы заменить все латинские/акцентированные символы с их основными буквами алфавита и вырезать все, что не может быть преобразованыКак конвертировать VARCHAR в ASCII7

примеров:

'ë' to be replaced with 'e' 
'ß' to be replaced with 's' , 'ss' if possible, if neither then strip it 

я могу это сделать в коде C#, но им просто не очень хорошо в MSSQL, чтобы решить эту проблему, не занимая много дней.

ОБНОВЛЕНИЕ: данные в столбце varchar заполняются из триггера на другой таблице, который должен иметь обычный текст UNICODE. Я хочу преобразовать текст в ascii7 в функцию, используемую для дальнейшей обработки.

ОБНОВЛЕНИЕ: Я предпочитаю решение, где это можно сделать только в SQL и избегать персонализированного сопоставления символов. можно ли это сделать, или это в настоящее время просто невозможно?

+2

Вы можете не только раздеть/изменить вход на ваш запрос? – purtip31

+3

Будьте осторожны! Удаление акцентов может изменить значения слов. Это может дать вам юридические проблемы и в экстремальных обстоятельствах может даже привести к смерти: [Пропущенная точка сотового телефона убивает двух людей, больше трогает в тюрьме] (http://gizmodo.com/382026/a-cellphones-missing-dot- убивает-двух-людей-ставит-три-более-в-тюрьме) –

+1

@MarkByers HOLY MACKEREL. Провел некоторое время в Турции, и да, закрытое я важно. – swasheck

ответ

2

Как сказал Аарон, я не думаю, что вы можете полностью отображать таблицы отображения в SQL, но отображение символов в ASCII-7 должно включать некоторые довольно простые таблицы, используемые в сочетании с AI-сопоставлениями. Здесь есть две таблицы: одна для отображения символов в столбце и одна для буквы алфавита (которая при необходимости может быть расширена).

Используя AI-сопоставления, я получаю множество явных определений отображения.

----------------------------------------------- 
-- One time mapping table setup 
CREATE TABLE t4000(i INT PRIMARY KEY); 
GO 

INSERT INTO t4000 --Just a simple list of integers from 1 to 4000 
SELECT ROW_NUMBER()OVER(ORDER BY a.x) 
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) a(x) 
CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) b(x) 
CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) c(x) 
CROSS APPLY (VALUES(1),(2),(3),(4)) d(x) 
GO 

CREATE TABLE TargetChars(ch NVARCHAR(2) COLLATE Latin1_General_CS_AI PRIMARY KEY); 
GO 

INSERT TargetChars -- A-Z, a-z, ss 
SELECT TOP(128) CHAR(i) 
FROM t4000 
WHERE i BETWEEN 65 AND 90 
    OR i BETWEEN 97 AND 122 
UNION ALL 
SELECT 'ss' 
-- plus any other special targets here 
GO 

----------------------------------------------- 
-- function 
CREATE FUNCTION dbo.TrToA7(@str NVARCHAR(4000)) 
RETURNS NVARCHAR(4000) 
AS 
BEGIN 
    DECLARE @mapped NVARCHAR(4000) = ''; 
    SELECT TOP(LEN(@str)) 
    @mapped += ISNULL(tc.ch, SUBSTRING(@str, i, 1)) 
    FROM t4000 
    LEFT JOIN TargetChars tc ON tc.ch = SUBSTRING(@str, i, 1) 
    COLLATE Latin1_General_CS_AI; 

    RETURN @mapped; 
END 
GO 

Пример использования:

SELECT dbo.TrToA7('It was not á tötal löß.'); 

Результат:

-------------------------- 
It was not a total loss. 
+0

im, чтобы избежать произвольного сопоставления, если это возможно. –

+1

@Lawrence Я не знаю, как это сделать, и что вы хотите избежать, и что вы можете избежать может быть две разные вещи. –

+0

Я впечатлен. для кого-то с небольшим опытом работы с sql это будет выглядеть как черная магия. кому-то с основными способностями - genuis. –

Смежные вопросы