从SQL Server中的列替换多个字符

时间:2012-02-09 09:29:17

标签: sql sql-server

在我的项目中,有时会发生用户在名称列中输入非英文字符。我想在我的数据库中搜索非英文字符的多个表并删除它们或用''替换(空字符串)。

我已经通过以下链接但仍然回答不清楚:

  1. Replacing multiple characters in SQL
  2. Replacing characters in access SQL
  3. MSDN: Pattern matching using Regular Expression
  4. 寻找将执行此任务的SQL脚本。目前我正在使用替换方法,如:

    update TBLDAILYROUTINE a   set a.NAME = replace(a.NAME,'é','')
    

3 个答案:

答案 0 :(得分:2)

正如其他人评论的那样,最好在数据进入数据库之前进行验证和替换。

为了清理现有数据,最简单的方法可能是use a SQL CLR UDF,可以在需要清理的列上运行。

快速而脏的C#代码段,用于清除所有非ASCII字符(副作用'?'也被删除):

public static string StripNonAsciiContent(string source)
{
    Encoding utf8 = new UTF8Encoding();
    Encoding ascii = Encoding.ASCII;

    byte[] input = utf8.GetBytes(source); 
    byte[] output = Encoding.Convert(utf8, ascii, input);

    return ascii.GetString(output).Replace("?", "");
}

更好的方法是编写一个正则表达式来替换允许范围之外的所有字符:

public static string StripNotAllowedCharacters(string source)
{
    return Regex.Replace(source, @"[^a-zA-Z-]", "");
}

答案 1 :(得分:0)

如何使用功能? 创建功能:

CREATE FUNCTION dbo.sf_ReplaceChars (@MyString NVARCHAR(MAX))
RETURNS NVARCHAR(50)
AS
BEGIN
    DECLARE @tmpString NVARCHAR(100)
    SET @tmpString = @MyString 
    SET @tmpString = LOWER(@tmpString)
    SET @tmpString =  REPLACE(@tmpString,'à', 'a')
    SET @tmpString =  REPLACE(@tmpString,'è', 'e')
    SET @tmpString =  REPLACE(@tmpString,'é', 'e')
    SET @tmpString =  REPLACE(@tmpString,'ì', 'i')
    SET @tmpString =  REPLACE(@tmpString,'ò', 'o')
    SET @tmpString =  REPLACE(@tmpString,'ù', 'u')
    SET @tmpString =  REPLACE(@tmpString,'ç', 'c')
    RETURN @tmpString
END
GO

然后在需要时使用它,假设用户输入存储在变量@userInput:

INSERT INTO myTable (text) VALUES select dbo.sf_ReplaceChars(@userInput)

您可以为该功能添加更多REPLACE以满足您的所有需求。

此致 托马斯

答案 2 :(得分:0)

运行以下查询:

declare @table varchar(50)
declare @column varchar(50)
declare @updateCommand varchar(50)

DECLARE AllMyColumns CURSOR FOR
    SELECT top 1 OBJECT_NAME(c.OBJECT_ID) TableName, c.name ColumnName
    FROM sys.columns AS c
    JOIN sys.types AS t ON c.user_type_id=t.user_type_id
    WHERE t.name = 'varchar' --select your datatype
    ORDER BY c.OBJECT_ID
OPEN AllMyColumns
FETCH NEXT FROM AllMyColumns into @table, @column;

WHILE @@FETCH_STATUS = 0 BEGIN
     set @updateCommand = 'update '+ @table + ' set '+ @column + ' = replace('+ @column +',''é'','''')'

    exec(@updateCommand)
    FETCH NEXT FROM AllMyColumns into @table, @column;
end

close AllMyColumns
DEALLOCATE AllMyColumns

我使用您建议的更新命令编辑