如何将varchar转换为ASCII7

时间:2012-06-23 15:57:59

标签: 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以用于进一步处理。

更新:我更喜欢这样的解决方案,只能在SQL中完成,并避免自定义字符映射。可以这样做,还是目前不可能?

1 个答案:

答案 0 :(得分:2)

正如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.