SQL替换数据库中的所有值,无论列和表

Posted

技术标签:

【中文标题】SQL替换数据库中的所有值,无论列和表【英文标题】:SQL Replace all values in database, no matter column and table 【发布时间】:2012-06-24 18:03:17 【问题描述】:

我正在尝试更改与其列名或表无关的特定值。

例如它可以出现在:

column `name` in the table `users`

还有:

column `hi` in the table `jokes`

还有更多未知的地点。 如何对数据库中的所有 sql 数据运行循环来更改它?

我正在使用 phpMyAdmin

【问题讨论】:

你在说多少张桌子?您要么需要为每个表中的每个字段编写更新,要么编写编写代码 (Dynamic SQL) 的代码来执行更新。您最终在同一个地方,都对所有表中的所有字段运行更新,但动态 SQL 选项不是微不足道的。您最好使用复制和粘贴来编写一大堆查询,这些查询对不同的表执行几乎相同的操作。 @Dems 真的吗?想象一下,您需要创建一堆字符串。它将由来自数据库的静态字符串和数据组成。然后,您将使用这些字符串作为参数传递给其他东西。您认为最好的解决方案是复制粘贴? “我正在尝试更改一个与其列名或表无关的特定值。” Oof。这里有一个问题,但是和句子的第二部分有关。 @ConradFrix - 我的理解是数据是静态的(来自问题的specific value)。如果是这种情况,它感觉就像是大量简单和相似的查询。如果这是错误的,那么复制和粘贴可能不是一个直接的解决方案。 【参考方案1】:

对于 SQL server 2000:我编写了这个脚本

-- full search and replace version sql server 2000
SET NOCOUNT ON

DECLARE @columnname varchar(255), @tablename varchar(255), @sql varchar(8000), @oldvalue varchar(1000), @newvalue varchar(1000)

SET @oldvalue = 'OldText' -- text to replace
SET @newvalue = 'NewText'  -- text to replace by

DECLARE table_cursor CURSOR FOR
select name from sysobjects where xtype='U' AND [name] LIKE 'MyTablePrefix_%' -- your table prefix
OPEN table_cursor

FETCH NEXT FROM table_cursor
INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

PRINT 'Updating Table: ' + @tablename + '...'

DECLARE column_cursor CURSOR FOR
SELECT     syscolumns.name AS column_name
FROM         sysobjects INNER JOIN
                      syscolumns ON sysobjects.id = syscolumns.id INNER JOIN
                      systypes ON syscolumns.xtype = systypes.xtype
WHERE     (sysobjects.xtype = 'U')
AND       systypes.[name] IN ('varchar','nvarchar','text','ntext')
AND       sysobjects.name =  @tablename
ORDER BY sysobjects.name, syscolumns.colid

OPEN column_cursor
FETCH NEXT FROM column_cursor INTO @columnname

WHILE @@FETCH_STATUS = 0
BEGIN

PRINT 'Updating Column: ' + @columnname + '...'

SET @SQL = 'UPDATE ' + @tablename
SET @SQL = @SQL + ' SET ' + @columnname + ' = Replace(CAST(' + @columnname + ' AS nvarchar(4000)),'''+ @oldvalue + ''',''' + @newvalue + ''')'
--PRINT @sql
EXECUTE(@SQL)

FETCH NEXT FROM column_cursor INTO @columnname
END

CLOSE column_cursor
DEALLOCATE column_cursor

FETCH NEXT FROM table_cursor
INTO @tablename

END
CLOSE table_cursor
DEALLOCATE table_cursor

在夜间运行它,因为在大中型数据库上运行需要相当长的时间......

【讨论】:

这个链接中有一个脚本,你可以在这里查看github.com/massooti/db_fieldReplacer【参考方案2】:

正如你所说的 PHPMyAdmin,我想你正在使用 mysql

见:

Search for all occurrences of a string in a mysql database 或Find and replace in entire mysql database。

还有一个 PHP 脚本可以做到这一点:

Search and Replace text in whole MySQL database

【讨论】:

谢谢!完美的解决方案。 不客气。如果答案有用,请投赞成票... :-)

以上是关于SQL替换数据库中的所有值,无论列和表的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 或 PL/SQL 对多个表中的列和表名进行动态查询

如何检索所有表列、数据类型、数据长度、约束类型以及引用的列和表

Pandas 数据框:按列和行替换值的性能是不是有差异?

需要用表名和表的模式列出 SQL Server 数据库中的所有触发器

第四章 检索数据

如何从sqlite中的计算列和表中的列计算天数