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 对多个表中的列和表名进行动态查询
如何检索所有表列、数据类型、数据长度、约束类型以及引用的列和表