【问题标题】:Search and Replace a a partial string / substring in mssql tables在 mssql 表中搜索和替换部分字符串/子字符串
【发布时间】:2015-05-02 14:33:26
【问题描述】:

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

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

举个例子:

Common_BodyPartRecord 具有类型为ntext 的字段Text,其中包含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访问数据库

非常感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

    您不能直接操作NTEXT 数据类型,但可以将CAST 转换为VARCHAR(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),然后进行替换,然后再将其转换回 NTEXT。

    【讨论】:

    • 非常感谢您的回答。我不熟悉铸造的概念,而且 MSDN 链接似乎是针对有经验的用户。您能否澄清一下,以便我更好地了解正在发生的事情?这是否会转换 Text 列的数据类型,从而可能破坏 CMS?这是否会对Text 列中的HTML 内容产生任何影响(因此不再被解释为HTML)?
    • @Konadi 我已经充实了我的答案。此更新的唯一效果是将“/oldserver.com/foo/”替换为“/newserver.org/bar/”。它不应该破坏 CMS,但在执行此类操作之前始终进行备份 :)
    • 再次感谢您的帮助和解释。我刚刚使用您提供的 SQL 查询尝试了一个简单的子字符串替换,它似乎工作得很好。 (顺便说一句。在查询末尾的 LIKE 部分中有一个撇号过多)。先生,您拯救了我的一天。
    猜你喜欢
    • 2016-12-08
    • 2014-06-22
    • 2015-10-03
    • 2016-01-19
    • 2015-11-13
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多