You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检索含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:07:16