Search code examples
sql-serverquotesdouble-quotes

Replace character in all database fields


We received an MSSQL database with many tables and fields which we need to clean. One of the things we need to do is remove all quotes (chr(34) and chr(39)) from any text fields.

Looking for a way to do this automatically instead of manually.


Solution

  • A non-set based approach:
    The below sproc basically does what you need.
    It uses nested WHILE loops

    • the parent WHILE loop gets all user defined tables
    • the nested WHILE loop goes through all char-based columns (which you can modify). Then it uses dynamic SQL to update with new string.

    For many tables and large sized tables, this would obviously take quite a while to complete. I am sure this can be optimized better.
    If anyone can find a set-based approach, that would be something.

    Source & Courtesy: Vyaskn

    CREATE PROC SearchAndReplace
    (
        @SearchStr nvarchar(100),
        @ReplaceStr nvarchar(100)
    )
    AS
    BEGIN
    
        SET NOCOUNT ON
    
        DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
        SET  @TableName = ''
        SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
        SET @RCTR = 0
    
        WHILE @TableName IS NOT NULL
        BEGIN
            SET @ColumnName = ''
            SET @TableName = 
            (
                SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                FROM    INFORMATION_SCHEMA.TABLES
                WHERE       TABLE_TYPE = 'BASE TABLE'
                    AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                    AND OBJECTPROPERTY(
                            OBJECT_ID(
                                QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                 ), 'IsMSShipped'
                                   ) = 0
            )
    
            WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
            BEGIN
                SET @ColumnName =
                (
                    SELECT MIN(QUOTENAME(COLUMN_NAME))
                    FROM    INFORMATION_SCHEMA.COLUMNS
                    WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                        AND TABLE_NAME  = PARSENAME(@TableName, 1)
                        AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                        AND QUOTENAME(COLUMN_NAME) > @ColumnName
                )
    
                IF @ColumnName IS NOT NULL
                BEGIN
                    SET @SQL=   'UPDATE ' + @TableName + 
                            ' SET ' + @ColumnName 
                            + ' =  REPLACE(' + @ColumnName + ', ' 
                            + QUOTENAME(@SearchStr, '''') + ', ' + QUOTENAME(@ReplaceStr, '''') + 
                            ') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    EXEC (@SQL)
                    SET @RCTR = @RCTR + @@ROWCOUNT
                END
            END 
        END
    
        SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
    END