2012-02-09 131 views
2

在我的項目中,有時會發生用戶在名稱列中輸入非英文字符的情況。我想在我的數據庫中搜索多個表格中的非英文字符,並刪除它們或用''(空字符串)替換。從SQL服務器的列中替換多個字符

我已經通過以下鏈接消失,但仍回答不明確:

  1. Replacing multiple characters in SQL
  2. Replacing characters in access SQL
  3. MSDN: Pattern matching using Regular Expression

尋找一個SQL腳本,將做這個任務。目前我正在使用替換方法,如下所示:

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

不宜應用程序應該驗證其數據進入數據庫之前更新命令編輯? – StuartLC 2012-02-09 09:32:55

+1

準確地說,在用戶輸入所有這些值時進行驗證。在這裏你可以使用任何方法。但最可靠的是正則表達式。另一方面,數據庫只是一個存儲空間。除CRUD外,不要進行任何處理。 – Oybek 2012-02-09 09:37:56

+0

我同意客戶端驗證,但也許這不是一個選項,它可以被「智能」用戶繞過。服務器驗證/替換隻是不能失敗。 – Thomas 2012-02-09 09:42:23

回答

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) 

您可以添加更多的替換對功能涵蓋您的所有需求。

問候 托馬斯

+0

容易出錯。如果將會出現?,甚至? – Oybek 2012-02-09 09:38:44

+0

您將以無限數量的替換結束,並且永遠不會結束。這反過來會降低您的服務器時,會有太多的替代品。 – Oybek 2012-02-09 09:40:09

+0

當然你是對的,但這是爲了解決用戶輸入:將會有多少輸入? 順便說一句,他還可以設置一個存儲過程每晚糾正每個表的每一列... – Thomas 2012-02-09 09:50:50

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-]", ""); 
} 
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 

我用你的建議