Sql server 如何将varchar转换为ASCII7

Sql server 如何将varchar转换为ASCII7,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我想用基本字母替换任何拉丁/重音字符,去掉所有不能转换的字符 示例: 'ë' to be replaced with 'e' 'ß' to be replaced with 's' , 'ss' if possible, if neither then strip it 我可以用c代码来做这件事,但我对MSSQL没有太多的经验,不需要花很多天就能解决这个问题 更新:varchar列中的数据是从另一个表上的触发器填充的,该表应具有正常的UNICODE文本。我想在函数中将文本转换为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中完成,并且避免自定义字符映射。这是可以做到的,还是目前不可能做到?

正如Aaron所说,我认为不能完全用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.

你能不能不直接删除/更改查询的输入?小心!去掉重音可以改变单词的意思。这可能会给你带来法律问题,在极端情况下甚至可能导致死亡:@MarkByers HOLY MACKEREL。在土耳其呆了一段时间,是的,闭合i很重要。我理解这一点,并将在我的解决方案中加以考虑。C#line是您当前在CLR函数中使用的东西吗?如果possible@Lawrence我不知道有什么方法可以在本地进行翻译,所以你想要避免的和你可以避免的可能是两件不同的事情。我印象深刻。对于一个对sql几乎没有经验的人来说,这看起来像是黑魔法。给有基本能力的人-真。