2012-06-22 51 views
2

我试图更改一个特定的值,它没有连接到它的列名或表。SQL替换数据库中的所有值,无论列和表

例如,它可以出现在:

column `name` in the table `users` 

而且还表现在:

column `hi` in the table `jokes` 

还有很多未知的地方。 如何在我的数据库中的所有sql数据上运行一个循环来更改它?

我使用phpMyAdmin

+0

你在说几个表?您需要为每个表中的每个字段编写更新,或者编写编写代码*(动态SQL)*的代码来执行更新。你最终在同一个地方,都在所有表中的所有字段上运行更新,但动态SQL选项是*不重要。复制和粘贴可能会更好,可以编写一大堆查询,这些查询对不同的表执行几乎相同的操作。 – MatBailie

+0

@Dems真的吗?想象一下,你需要创建一堆字符串。它将由静态字符串和来自数据库的数据组成。然后,您将使用这些字符串作为参数传递给其他人。你认为最好的解决方案是复制粘贴? –

+0

*“我正在尝试更改与列名或表格无关的特定值。”* Oof。这里有一个问题,但它与句子的第二部分有关。 – Jason

回答

0

对于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 

运行它写这个剧本因为在大中型数据库上运行需要相当长的时间...

相关问题