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

Search and Replace a a partial string / substring in mssql tables

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

我已经隔离/固定了出现 URL 的 table 和字段,但我缺少 (MS)SQL experience/knowledge 来执行 "search - replace".所以我来这里寻求帮助(我尝试将 tables 导出到 .sql 文件,在文本编辑器中进行搜索替换,然后重新导入 .sql 文件到数据库,但是 运行 出现了几个语法错误...所以我需要这样做 "SQL way").

举个例子:

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

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

我平时是做前端的,机缘巧合下了这个任务。我在玩 PHP 相关内容的那一天使用了 MySQL,但从未超越 SQL 的基本知识 - 如果您可以保留更多解释或不太适合新手。

SQL服务器版本是SQL Server 9.0.4053,我可以通过Microsoft SQL Server Management Studio 12

访问数据库

非常感谢任何帮助!

您无法操纵 NTEXT datatype directly, but you can CAST it to VARCHAR(MAX), then use the REPLACE function to perform the string replacement, then CAST it back to NTEXT. This can all be done in a single 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 服务器进行非更改,即如果不需要更改值,则不需要更新它自己。

CAST函数用于改变一个值的数据类型。 NTEXT 是一种用于存储大字符值的旧数据类型,NVARCHAR(MAX) 是一种用于存储大字符值的新的、更通用的数据类型。 REPLACE 函数不能对 NTEXT 值进行操作,因此需要先将其转换为 NVARCHAR(MAX),进行替换,然后再将其转换回 NTEXT。