Friday, 28 November 2008

XmlSerializer - invalid characters

Using the XmlSerializer class, I got the following error:

'', hexadecimal value 0x0F, is an invalid character.

This was down to some dodgy legacy database data that contained ascii control characters (0 - 31). I wrote this SQL script to remove all ascii chars 0 - 31 from all character columns in a table:

I used this T-SQL Beautifier to make the SQL look nice


Use at your own risk!

DECLARE @table varchar(50)
SET @table = 'MyTable'

SET NOCOUNT ON

DECLARE @column varchar(50)

DECLARE column_cursor CURSOR FOR 
    SELECT    column_name
    FROM    information_schema.columns
    WHERE    table_name = @table
    AND        data_type LIKE '%char'

OPEN column_cursor
FETCH NEXT FROM column_cursor INTO @column

WHILE @@FETCH_STATUS = 0 BEGIN

    DECLARE @charCode int
    SET @charCode = 0
    WHILE @charCode < 32 BEGIN

        DECLARE @sql varchar(max)
        SET @sql = 'UPDATE ' + @table + ' SET ' + @column + 
            ' = REPLACE(' + @column + ', char(' + CAST(@charCode AS varchar) + '), '''')' +
            ' WHERE ' + @column + ' LIKE ''%'' + char(' + CAST(@charCode AS varchar) + ') + ''%'''

        --PRINT @sql

        DECLARE @rowcount int
        EXEC(@sql)
        SET @rowcount = @@rowcount

        IF @rowcount > 0
            PRINT 'char ' + CAST(@charCode AS varchar) + ' replaced ' + 
                CAST(@rowcount AS varchar) + ' times in column ' + @column

        SET @charCode = @charCode + 1
    END
    
    FETCH NEXT FROM column_cursor INTO @column

END

CLOSE column_cursor
DEALLOCATE column_cursor

SET NOCOUNT OFF

0 comments: