【问题标题】:Remove characters from a SQL Table [closed]从 SQL 表中删除字符 [关闭]
【发布时间】:2014-04-08 00:08:17
【问题描述】:

我有大约 80 张桌子(每张桌子大约有 12,000 行和 190 列)

我需要通过删除其中的几个字符来清理数据。 (ƒ、€ 和 ¢)

这些字符出现在整个数据库中(可以在数据中的任何位置),我需要将它们全部删除。有什么有效的方法吗?

我曾尝试编写 C# 应用程序 - 使用 datareader 读取数据,然后检查字符是否出现然后删除它们,最后将数据更新回表中。但是,这种方法太耗时了。

【问题讨论】:

    标签: c# sql stored-procedures


    【解决方案1】:

    我确信有更有效的方法,但这样的方法应该适合你。

    我正在使用系统表/视图来获取数据库和列的列表,然后使用动态 SQL 来构建更新语句。作为一次性过程,这应该没问题。

    ------------------------------------------------------------------------------
    -- Define find/replace values here
    ------------------------------------------------------------------------------
    IF OBJECT_ID('tempdb..#FindAndReplace') IS NOT NULL DROP TABLE #FindAndReplace
    CREATE TABLE dbo.#FindAndReplace(
        FindValue VARCHAR(255) PRIMARY KEY,
        ReplaceValue VARCHAR(255)
    )
    
    INSERT INTO #FindAndReplace SELECT 'ƒ', 'replacement'
    INSERT INTO #FindAndReplace SELECT '€', 'goes'
    INSERT INTO #FindAndReplace SELECT '¢', 'here'
    
    
    ------------------------------------------------------------------------------
    -- Then build and execute replace statements here
    ------------------------------------------------------------------------------
    --loop through all tables
    DECLARE @TableName VARCHAR(255)
    DECLARE TableCursor CURSOR FOR
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    
    OPEN TableCursor
    FETCH NEXT FROM TableCursor 
    INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        --then all columns
        DECLARE @ColumnName VARCHAR(255)
        DECLARE ColumnCursor CURSOR FOR
        SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = @TableName
        AND DATA_TYPE IN ('nvarchar', 'varchar')
    
        OPEN ColumnCursor
        FETCH NEXT FROM ColumnCursor 
        INTO @ColumnName
        WHILE @@FETCH_STATUS = 0
        BEGIN
    
            --then all find-replace values
            DECLARE @FindValue VARCHAR(255)
            DECLARE @ReplaceValue VARCHAR(255)
            DECLARE FindReplaceCusor CURSOR FOR
            SELECT FindValue, ReplaceValue
            FROM #FindAndReplace
    
            OPEN FindReplaceCusor
            FETCH NEXT FROM FindReplaceCusor 
            INTO @FindValue, @ReplaceValue
            WHILE @@FETCH_STATUS = 0
            BEGIN
    
                DECLARE @SQL NVARCHAR(MAX)
                SET @SQL = 'UPDATE [' + @TableName + '] SET [' + @ColumnName + '] = REPLACE([' + @ColumnName + '], ''' + @FindValue + ''', ''' + @ReplaceValue + ''') WHERE [' + @ColumnName + '] LIKE ''%' + @FindValue + '%'''
                PRINT @SQL
                EXEC sp_executesql @SQL
    
            FETCH NEXT FROM FindReplaceCusor INTO @FindValue, @ReplaceValue
            END
            CLOSE FindReplaceCusor
            DEALLOCATE FindReplaceCusor
    
        FETCH NEXT FROM ColumnCursor INTO @ColumnName
        END
        CLOSE ColumnCursor
        DEALLOCATE ColumnCursor
    
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor
    

    【讨论】:

      【解决方案2】:

      你可以调用一些 T-SQL 来执行搜索和替换

      查看Search and replace part of string in database的这个答案

      UPDATE
          Table
      SET
          Column = Replace(Column, 'find value', 'replacement value')
      WHERE
          xxx
      

      【讨论】:

      • 你能再解释一下吗?在 WHERE 子句中我需要什么?我真的必须指定所有的列名吗?请注意,我有大约 80 个表,每个表都包含约 190 个不同的列名
      • 没有必要指定 WHERE 子句——只有当你想对行的子集运行 SET 时才需要——如果你想对整个表运行它,只需省略WHERE 子句 - w3schools.com/sql/sql_update.asp
      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多