在SQL Server数据库中查找电子邮件地址

时间:2013-07-31 00:11:57

标签: sql sql-server-2008 windows-server-2008-r2

我被要求编辑内容的网站上有几百个基于模板的现有页面(博客文章)。我已经调整了模板内容中的电子邮件地址,因此所有新文章都会有正确的地址,但我想替换现有页面上的旧地址。

该网站是基于SQL Server数据库构建的.aspx。

我可以访问数据库,但不知道哪些表(更不用说列或单元格)包含特定的电子邮件地址。

我想首先搜索数据库,找到文本/内容中此电子邮件地址的所有外观,然后,如果没有出现会产生不利影响,我想执行查找/替换以将其更新为新地址。

我不熟悉SQL Server。我该怎么做?

仅供参考...网站上的代码(它是评论表的一部分)将永远是:

<input type="hidden" value="user@emaildomain.com.au" name="Notify" />

修改
我根本不知道html字符串在数据库中的位置,但我已经做了一些搜索,发现我需要更改电子邮件地址的页面都是由一个表和列定义的。

DB = CMSDB
Table = dbo.tblContent
Column = ContentText

我正在使用Microsoft SQL Server Management Studio Express查看数据库

2 个答案:

答案 0 :(得分:2)

这将为数据库中所有用户表中的每个基于字符的列生成单独的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,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 + '%';

答案 1 :(得分:0)

您可以将所有表格导出为 UPDATE 语句,然后您可以使用linux实用程序调用 sed 来更新行。

你需要这样的东西:

sed -i 's/old_email/new_email/g' sql.file