2010-01-26 85 views
1

我需要一个解决方案(T-SQL函数/过程)来解析SQL Server的VARCHAR(max)和消除所有特殊字符和口音SQL服务器字符串解析为特殊字符

此字符串的输出将被改造转换为CSV文件,使用AWK脚本打破特殊字符(如'&', '%', '\')和转换为未知字符的所有重音字符(如français中的ç),这就是为什么我需要此解析器。

谢谢

回答

0

如果我得到你的权利:

SELECT REPLACE('abc&de','&','_') 
+0

当然,但这意味着我必须搜索脚本会破坏的所有字符,您是否至少可以给我一个可以使用SQL的替换函数的字符列表? 或其他一些方法,至少摆脱我的字符串中的所有重音字符..就像切换整理和消除未知字符? – Paul 2010-01-26 11:14:24

+0

另外,REPLACE SQL函数不区分大小写,如果我选择'replace'('Montréalis nicE','é','e')'',那么输出结果是蒙特利尔很好,因此它将E计算为一个'é' – Paul 2010-01-26 11:42:38

+0

啊,好吧,找到你了。我猜你只想在你的结果中使用a-z,A-Z和0-9?你应该使用正则表达式,但SQL Server不支持nativeley。如果它必须用t-sql完成,也许这是有效的:http://www.sqlteam.com/article/regular-expressions-in-t-sql 未经我自己测试,但看起来像它可以工作。 – Steffen 2010-01-26 20:44:44

2

你可以试试这个:

CREATE TABLE dbo.Bad_ASCII_Characters (ascii_char CHAR(1) NOT NULL) 

DECLARE @i INT 
SET @i = 1 
WHILE @i <= 255 
BEGIN 
    IF (@i <> 32) AND 
     (@i NOT BETWEEN 48 AND 57) AND 
     (@i NOT BETWEEN 65 AND 90) AND 
     (@i NOT BETWEEN 97 AND 122) 
    BEGIN 
     INSERT INTO dbo.Bad_ASCII_Characters (ascii_char) VALUES(CHAR(@i)) 
    END 

    SET @i = @i + 1 
END 

DECLARE @row_count INT 
SET @row_count = 1 

WHILE (@row_count > 0) 
BEGIN 
    UPDATE T 
    SET my_column = REPLACE(my_column, ascii_char, '') 
    FROM My_Table T 
    INNER JOIN dbo.Bad_ASCII_Characters BAC ON 
      T.my_column LIKE '%' + BAC.ascii_char + '%' 

    SET @row_count = @@ROWCOUNT 
END 

我没有测试过,所以你可能需要调整它位。您可以随时生成表格,也可以将其保留在此处,如果需求略有变化(例如,您发现某些字符可以正确解析),则可以更改表格中的数据。

更新周围的WHILE循环可防止某些列包含多个特殊字符。如果你的桌子很大,你可能会在这里看到一些性能问题。