UPDATE
这将为数据库中所有用户表中的每个基于字符的列生成单独的语句。您可能可以将其增强为嵌套,这样您就可以省略任何UPDATE
行中不包含旧电子邮件地址的列的任何语句,但作为一次性任务,增加的复杂性不太可能得到回报。
DECLARE
@oldEmailAddress VARCHAR(320) = 'oldaddress@foo.com',
@newEmailAddress VARCHAR(320) = 'newaddress@bar.com';
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT TOP (5) @sql += N'
PRINT N''Updating ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
+ '.' + QUOTENAME(name) + '...'';
UPDATE '
+ QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
+ ' SET ' + QUOTENAME(name) + ' = REPLACE('
+ QUOTENAME(name) + ', @old, @new)
WHERE ' + QUOTENAME(name) + ' LIKE ''%'' + @old + ''%'';'
FROM sys.columns AS c
WHERE system_type_id IN (35,99,167,175,231,239)
AND EXISTS (SELECT 1 FROM sys.tables WHERE [object_id] = c.[object_id]);
PRINT @sql;
/*
EXEC sp_executesql
@sql,
N'@old VARCHAR(320), @new VARCHAR(320)',
@oldEmailAddress, @newEmailAddress;
*/
您确实应该考虑在此处放置某种令牌,并让网页将令牌替换为您存储在单个配置文件或表中的电子邮件地址。你知道,而不是仅仅用另一个电子邮件地址的几十个实例替换必须更改的数十个实例,而另一个电子邮件地址可能在未来某个时间必须更改(此时您将争先恐后地找到这篇文章,这样你就可以重复这个过程)。
如果内容仅在一张表的一列中,您的任务会容易得多。但是,您应该更新您的问题以反映这一点,因为目前听起来它将在多个列/表中:
但不知道哪些表格(更不用说列或单元格)包含特定的电子邮件地址。
现在你说:
DB = CMSDB,表 = dbo.tblContent,列 = ContentText
因此,要求令人困惑。如果邮箱地址真的只能出现在上一栏,那么如下:
USE CMSDB;
GO
DECLARE
@oldEmailAddress VARCHAR(320) = 'oldaddress@foo.com',
@newEmailAddress VARCHAR(320) = 'newaddress@bar.com';
UPDATE dbo.tblContent
SET ContentText
= REPLACE(ContentText, @OldEmailAddress, @NewEmailAddress)
WHERE ContentText LIKE '%' + @OldEmailAddress + '%';