如何检索含destination列的数据库表并提取唯一邮箱域名?
解决方案:提取指定表中邮箱列的唯一域名列表
针对你的需求,直接修改原有代码即可实现——遍历所有rp_开头的用户表,提取destination列中的唯一邮箱域名,返回表名与对应域名列表。以下是优化后的代码:
-- 创建临时表存储结果 CREATE TABLE #DomainResults ( TableName VARCHAR(100), UniqueDomains VARCHAR(MAX) ) DECLARE @Table VARCHAR(100), @TableID INT, @ColumnName VARCHAR(100) = 'destination', -- 固定目标列名 @DynamicSQL VARCHAR(MAX) -- 遍历所有rp_开头的用户表 DECLARE CursorSearch CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U' AND name LIKE 'rp_%' OPEN CursorSearch FETCH NEXT FROM CursorSearch INTO @Table, @TableID WHILE @@FETCH_STATUS = 0 BEGIN -- 检查当前表是否存在destination列(文本类型) IF EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = @TableID AND name = @ColumnName AND system_type_id IN(167, 175, 231, 239) ) BEGIN -- 构建动态SQL:提取去重后的域名,用逗号拼接 SET @DynamicSQL = ' INSERT INTO #DomainResults (TableName, UniqueDomains) SELECT ''' + @Table + ''', STRING_AGG(DISTINCT domain, '', '') WITHIN GROUP (ORDER BY domain) FROM ( SELECT SUBSTRING(' + @ColumnName + ', CHARINDEX(''@'', ' + @ColumnName + ') + 1, LEN(' + @ColumnName + ')) AS domain FROM ' + @Table + ' WHERE ' + @ColumnName + ' IS NOT NULL AND CHARINDEX(''@'', ' + @ColumnName + ') > 0 -- 只处理合法邮箱格式 ) AS DomainList ' EXECUTE (@DynamicSQL) END FETCH NEXT FROM CursorSearch INTO @Table, @TableID END -- 输出最终结果 SELECT * FROM #DomainResults -- 清理资源 CLOSE CursorSearch DEALLOCATE CursorSearch DROP TABLE #DomainResults
关键优化说明
- 直接锁定
destination列,无需遍历所有文本列,提升执行效率 - 增加邮箱格式校验(判断是否包含
@),避免无效数据干扰 - 使用
STRING_AGG(SQL Server 2017+支持)将同表的唯一域名合并为逗号分隔的列表,结果更直观 - 用临时表统一存储结果,替代原有的PRINT输出,方便后续导出或进一步处理
注:若使用SQL Server 2016及以下版本,替换
STRING_AGG部分为兼容写法:
STUFF(( SELECT DISTINCT ', ' + domain FROM ( SELECT SUBSTRING(' + @ColumnName + ', CHARINDEX(''@'', ' + @ColumnName + ') + 1, LEN(' + @ColumnName + ')) AS domain FROM ' + @Table + ' WHERE ' + @ColumnName + ' IS NOT NULL AND CHARINDEX(''@'', ' + @ColumnName + ') > 0 ) AS DomainList FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 2, '')
内容的提问来源于stack exchange,提问作者wdh
相关产品推荐
相关产品推荐

