2015-03-02 110 views
0

我的任務是將安裝的Orchard CMS移至不同的服務器和域。所有內容(頁面內容,菜單結構,鏈接等)都存儲在MSSQL數據庫中。好處:將Orchard安裝的物理文件移動到新服務器時,數據庫將保持不變,無需遷移它。糟糕的是:網頁和菜單上散佈着大量絕對URL。搜索並替換mssql表中的部分字符串/子字符串

我已隔離/固定出現URL的表和字段,但我缺乏(MS)SQL經驗/知識來執行「搜索 - 替換」。所以我來這裏尋求幫助(我曾嘗試將表導出爲.sql文件,在文本編輯器中進行搜索替換,然後將.sql文件重新導入數據庫,但遇到了幾個語法錯誤......所以我需要這樣做「SQL方式」)。

舉個例子:

Common_BodyPartRecord具有包含HTML內容ntext類型的字段Text。我需要找到部分字符串/oldserver.com/foo/的每個發生並用/newserver.org/bar/替換它。在同一個表項中可能有多個模式發生。

(總共我有5種模式,將需要更換,所有的部分字符串/的URL,域/路徑字符串,等等)

我通常做前端的東西,來到這個任務的機會。我在使用MySQL的時候曾經使用過與PHP相關的東西,但是從來沒有經過過SQL的基本知識 - 如果你可以保持你的解釋或多或少對新手友好,這將是有幫助的。

SQL Server版本是SQL Server 9.0.4053,我必須通過Microsoft SQL Server Management Studio 12

訪問數據庫的任何幫助,不勝感激!

回答

0

不能直接操縱NTEXT數據類型,但可以將其CASTVARCHAR(MAX),然後使用REPLACE函數來執行字符串替換,然後將它轉換回NTEXT。這可以在一個UPDATE聲明中完成。

update MyTable 
    set MyColmun = cast(replace(cast(MyColumn as nvarchar(max)), N'/oldserver.com/foo/', N'/newserver.org/bar/') as ntext) 
    where cast(MyColumn as nvarchar(max)) LIKE N'%/oldserver.com/foo/%' 

在下面的UPDATE語句的WHERE子句用於防止SQL Server進行不改變,即如果該值並不需要改變那麼就沒有必要將其更新到自身。

CAST函數用於更改值的數據類型。 NTEXT是用於存儲大字符值的傳統數據類型,NVARCHAR(MAX)是用於存儲大字符值的新型且更通用的數據類型。 REPLACE函數不能對NTEXT值進行操作,因此需要先將其轉換爲NVARCHAR(MAX),然後進行替換,然後將其CAST返回到NTEXT。

+0

非常感謝您的回答。我不熟悉cast的概念,MSDN鏈接似乎針對有經驗的用戶。你能否澄清一下,讓我更好地理解發生了什麼?這會轉換「文本」列的數據類型,從而有可能破壞CMS嗎?這會以什麼方式影響「Text」列中的HTML內容(因此它不再被解釋爲HTML)? – Konadi 2015-03-02 10:33:00

+0

@Konadi我已經充實了我的答案。此更新的唯一影響是將'/oldserver.com/foo/'替換爲'/newserver.org/bar/'。它**不應該**破壞CMS,但總是做這樣的事情之前做一個備份:) – 2015-03-02 12:15:55

+0

再次感謝您的幫助和解釋。我剛剛使用您提供的SQL查詢嘗試了一個簡單的子字符串替換,它似乎工作得很好。 (順便說一句,查詢結尾的LIKE部分中有太多撇號)。先生,你救了我的一天。 – Konadi 2015-03-04 16:35:00