2011-09-13 127 views
1

我想修改下面的查詢:SQL查詢全部替換

UPDATE wp_posts 
SET post_content = 
     REPLACE(post_content, 'http://oldlink.com', 'http://newlink.com'); 

要的東西,通過所有表,列和價值觀去。一些與此類似(但不工作):

UPDATE * SET *= REPLACE(*, 'http://oldlink.com', 'http://newlink.com'); 

我想我的老鏈接的每個實例替換到我的數據庫我的新鏈接。有沒有辦法做到這一點?

UPDATE

對不起,我忘了提及,這是MySQL的。我目前正在審查所有答案,然後我會回來告訴你什麼工作。感謝大家!

更新2

嗨,大家好(女孩),我決定只轉儲數據庫和做手工搜索和替換(帶的TextWrangler)。由於這不是(目前)大型數據庫,它可能是最簡單的方法。

+7

什麼RDBMS好嗎? –

+1

最簡單的方法是將數據庫轉儲到平面文件中,替換它然後再導入。 –

回答

3

這裏是一個SQL Server上的工作 - 做類似的東西這個工作給你?

Search and Replace SQL Server data in all columns, of all tables

這裏的命名,SearchAndReplace的存儲過程,在當前 數據庫搜索 通過所有表的所有字符列,並取代給定的字符串提供 字符串其他用戶。

+2

+1,雖然我很期待自己寫一些史詩動態SQL :) – Yuck

0

你沒有提到數據庫。我目前使用Sybase ASA,在那裏你不能做到這一點從字面上,但它可以通過檢查從列名來完成的systablesyscolumn,然後加入使用execute immediate

1

這MSSQL腳本會抱怨了一下,如果有一個表中的計算列,但它仍然會執行:

DECLARE @searchvalue varchar(100) 
DECLARE @newvalue varchar(100) 
SET nocount off 

SET @searchvalue = 'http://oldlink.com' 
SET @newvalue = 'http://newlink.com' 

SELECT * into #t FROM 
(
SELECT 'update [' + a.TABLE_name + '] SET ['+ column_name+ ']=''' + @newvalue + ''' 
where [' +a.column_name+ 
']='''[email protected] +'''' sqlstring 
FROM INFORMATION_SCHEMA.COLUMNS a 
join 
INFORMATION_SCHEMA.TABLES b 
ON a.TABLE_name = b.TABLE_name 
and b.TABLE_type = 'base table' 
WHERE data_type in ('varchar', 'char', 'nvarchar') 
and character_maximum_length >= len(@newvalue) 
) a 

DECLARE @sqlstring as nvarchar(500) 
DECLARE SqlCursor CURSOR FAST_FORWARD FOR 
SELECT sqlstring FROM #t 
OPEN SqlCursor 
FETCH NEXT FROM SqlCursor 
INTO @sqlstring 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    EXEC(@sqlstring) 
    FETCH NEXT FROM SqlCursor 
    INTO @sqlstring 
END 
CLOSE SqlCursor 
DEALLOCATE SqlCursor 
DROP TABLE #t