SQL Server - SQL 替换整个数据库中所有表中的所有列

标签 sql sql-server

这是一个不太可能的事情,我猜这个问题没有简单的答案,但是...... 我继承了一个数据库,其中填充了一些可怕的数据。许多包含描述的行都有回车符,这意味着当我们 BCP 输出数据时,它会带有回车符。

我的问题: 有没有办法在 MS SQL Server 中对整个数据库进行全局替换?该数据库包含数百个表,因此逐个表执行此操作可能非常耗时。

任何提示或技巧将不胜感激。

提前致谢。 皮特.

最佳答案

我假设您想要在整个数据库中进行查找和替换。如果是这样,try this script from MSSQLTIPS 。它正是这样做的。

这是完整的脚本:

SET NOCOUNT ON

DECLARE @stringToFind VARCHAR(100)
DECLARE @stringToReplace VARCHAR(100)
DECLARE @schema sysname
DECLARE @table sysname
DECLARE @count INT
DECLARE @sqlCommand VARCHAR(8000)
DECLARE @where VARCHAR(8000)
DECLARE @columnName sysname
DECLARE @object_id INT

SET @stringToFind = 'Smith'
SET @stringToReplace = 'Jones'

DECLARE TAB_CURSOR CURSOR  FOR
SELECT   B.NAME      AS SCHEMANAME,
         A.NAME      AS TABLENAME,
         A.OBJECT_ID
FROM     sys.objects A
         INNER JOIN sys.schemas B
           ON A.SCHEMA_ID = B.SCHEMA_ID
WHERE    TYPE = 'U'
ORDER BY 1

OPEN TAB_CURSOR

FETCH NEXT FROM TAB_CURSOR
INTO @schema,
     @table,
     @object_id

WHILE @@FETCH_STATUS = 0
  BEGIN
    DECLARE COL_CURSOR CURSOR FOR
    SELECT A.NAME
    FROM   sys.columns A
           INNER JOIN sys.types B
             ON A.SYSTEM_TYPE_ID = B.SYSTEM_TYPE_ID
    WHERE  OBJECT_ID = @object_id
           AND IS_COMPUTED = 0
           AND B.NAME IN ('char','nchar','nvarchar','varchar','text','ntext')

    OPEN COL_CURSOR

    FETCH NEXT FROM COL_CURSOR
    INTO @columnName

    WHILE @@FETCH_STATUS = 0
      BEGIN
        SET @sqlCommand = 'UPDATE ' + @schema + '.[' + @table + '] SET [' + @columnName
                           + '] = REPLACE(convert(nvarchar(max),[' + @columnName + ']),'''
                           + @stringToFind + ''',''' + @stringToReplace + ''')'

        SET @where = ' WHERE [' + @columnName + '] LIKE ''%' + @stringToFind + '%'''

        EXEC( @sqlCommand + @where)

        SET @count = @@ROWCOUNT

        IF @count > 0
          BEGIN
            PRINT @sqlCommand + @where
            PRINT 'Updated: ' + CONVERT(VARCHAR(10),@count)
            PRINT '----------------------------------------------------'
          END

        FETCH NEXT FROM COL_CURSOR
        INTO @columnName
      END

    CLOSE COL_CURSOR
    DEALLOCATE COL_CURSOR

    FETCH NEXT FROM TAB_CURSOR
    INTO @schema,
         @table,
         @object_id
  END

CLOSE TAB_CURSOR 

关于SQL Server - SQL 替换整个数据库中所有表中的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28074051/

相关文章:

mysql - 获取每组分组结果的前n条记录

c# - EntityFramework 6 连接已关闭

sql - 删除一条sql语句中的所有表、存储过程、触发器、约束和所有依赖项

c# - TransactionScope TransactionAborted 异常 - 事务未回滚。应该吗?

MySQL 说 : #1064 - You have an error in your SQL syntax;

sql - Rails - 一个模型上的两个外键都指向同一个模型

mysql - 如果id在sql中相同,如何从两个表中获取值

Mysql带索引的查询需要很长时间

sql - @@SERVERNAME 与服务器属性 ('servername' )

sql - 使用内连接和字符串插值更新列