在mssql表中搜索并替换部分字符串/子字符串

时间:2015-03-02 09:33:44

标签: sql sql-server sql-server-2005 replace orchardcms

我的任务是将Orchard CMS的安装移动到不同的服务器和域。所有内容(页面内容,菜单结构,链接等)都存储在MSSQL数据库中。好的部分:将Orchard安装的物理文件移动到新服务器时,数据库将保持不变,无需迁移它。坏事:遍布页面和菜单的地方有很多绝对的URL。

我已经隔离/固定了URL所在的表格和字段,但我缺乏(MS)SQL经验/知识来执行"搜索 - 替换"。所以我来这里寻求帮助(我已经尝试将表导出到.sql文件,在文本编辑器中进行搜索替换,然后将.sql文件重新导入数据库,但遇到了几个语法错误......所以我需要这样做" SQL方式")。

举个例子:

表格Common_BodyPartRecord包含Text类型的字段ntext,其中包含HTML内容。我需要找到部分字符串/oldserver.com/foo/的每次出现,并将其替换为/newserver.org/bar/。在同一个表条目中可能会出现多次模式。

(总共我有5个需要替换的模式,url,域/路径的所有部分字符串/子串等)

我经常做前端的事情并偶然来到这个任务。在我玩PHP相关内容的那天,我已经使用了MySQL,但是从来没有超过SQL的基础知识 - 如果你可以保持你的解释或多或少新手友好,那将会有所帮助。

SQL Server版本为SQL Server 9.0.4053,我可以通过Microsoft SQL Server Management Studio 12

访问数据库

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您无法直接操作NTEXT数据类型,但您可以CAST将其更改为VARCHAR(MAX),然后使用REPLACE函数执行字符串替换,然后使用CAST它回到了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值进行操作,因此需要首先将其CAST到NVARCHAR(MAX),进行替换,然后再将其CAST回NTEXT。