在SQL Server数据库中查找电子邮件地址
一个我被要求编辑内容的网站有几百个基于模板的现有页面(博客文章)。我已经调整了模板内容中的电子邮件地址,以便所有新文章都有正确的地址,但我想替换现有页面上的旧地址 该网站是基于SQL Server数据库构建的.aspx 我可以访问数据库,但不知道哪些表(更不用说列或单元格)包含特定的电子邮件地址 我想首先在数据库上搜索,以查找此电子邮件地址在文本/内容中的所有外观,然后,如果没有对其产生不利影响的外观,我想进行查找/替换,以将其更新到新地址 我不熟悉SQL Server。我该怎么做 仅供参考。。。网站上的代码(它是评论表单的一部分)将始终为:在SQL Server数据库中查找电子邮件地址,sql,sql-server-2008,windows-server-2008-r2,Sql,Sql Server 2008,Windows Server 2008 R2,一个我被要求编辑内容的网站有几百个基于模板的现有页面(博客文章)。我已经调整了模板内容中的电子邮件地址,以便所有新文章都有正确的地址,但我想替换现有页面上的旧地址 该网站是基于SQL Server数据库构建的.aspx 我可以访问数据库,但不知道哪些表(更不用说列或单元格)包含特定的电子邮件地址 我想首先在数据库上搜索,以查找此电子邮件地址在文本/内容中的所有外观,然后,如果没有对其产生不利影响的外观,我想进行查找/替换,以将其更新到新地址 我不熟悉SQL Server。我该怎么做 仅供参考。。
<input type="hidden" value="user@emaildomain.com.au" name="Notify" />
我正在使用Microsoft SQL Server Management Studio Express查看数据库您可以将所有表导出为更新语句,并且可以使用linux实用程序调用sed来更新行 您需要这样做:
sed -i 's/old_email/new_email/g' sql.file
这将为数据库中所有用户表中每个基于字符的列生成一个单独的
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;
*/
<>你真的应该考虑在这里放置一些令牌,让Web页面用一个存储在单个配置文件或表中的电子邮件地址替换令牌。你知道,不要只是将一个必须更改的电子邮件地址的几十个实例替换为另一个可能在将来某个时候必须更改的电子邮件地址的几十个实例(此时,你将争先恐后地查找此帖子,以便重复此过程)
如果内容仅在一个表的一列中,则任务会简单得多。但是,您应该更新您的问题,以反映这一点,因为目前听起来它将出现在多个列/表中:
但不知道哪些表(更不用说列或单元格)包含特定的电子邮件地址
现在你说:
DB=CMSDB,Table=dbo.tblContent,Column=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 + '%';
这是“查找”还是“查找并替换”?这是“查找并替换”。如前所述,它打印出它将执行的命令(或者至少打印出它的前8kb,这是打印的限制,不是命令不完整的反映),但不会执行它。如果您查看了输出并相信它会如广告所示工作,请取消注释最后几行,然后再次运行它。我不知道这是否有帮助,但我找到了html字符串将显示的确切DB名称、表和列。。。DB=CMSDB,Table=dbo.tblContent,Column=ContentText。我正在使用“SQLServerManagementStudio Express”查看此内容。你能调整你的查询吗?@reecedportics你只需要在一列中找到这些信息?你的问题听起来像是在多个表的多个列中。可能,可能不是。我不知道在哪里可以找到它——因此我要求先“找到”。现在我知道它在哪里了,我只是编辑了我的问题以反映我的发现。我将尝试您的查询,并让您知道我的进展。
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 + '%';