如何查询SQL数据库中所有表内记录行添加人、绑定SSIS变量的姓名列的全部唯一值
全库提取SSIS绑定录入人列的去重人员值 实现方案
核心思路
完全依托SQL Server系统元数据视图定位全库所有符合规则的录入人列,无需手动逐表排查,再通过动态SQL拼接跨表查询,最终输出全库范围内的不重复人员名单,全程不受列所属的表、schema位置限制。
第一步:定位所有目标元数据
所有绑定SSIS变量、用于记录行添加人姓名的列通常有统一的命名规范,直接查询系统视图即可批量拉取全库匹配的列信息,过滤掉系统内置表避免无效扫描:
-- 按实际业务的列名规则调整匹配条件 SELECT s.name AS schema_name, t.name AS table_name, c.name AS column_name, ty.name AS data_type FROM sys.columns c INNER JOIN sys.tables t ON c.object_id = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id WHERE c.name LIKE '%CreatedBy%' -- 替换为你们实际的录入人列名匹配规则 AND t.is_ms_shipped = 0
注意:匹配规则要和SSIS包中映射的列名严格对齐,避免将存其他业务值的同名字段混入扫描范围
第二步:动态生成并执行跨表去重查询
基于第一步拿到的列清单,自动拼接所有表的列查询语句,通过UNION结构合并数据源,最后在外层做全局去重,无需手动编写每段跨表查询逻辑:
DECLARE @dynamic_sql NVARCHAR(MAX) = N''; -- 拼接所有目标列的查询片段 SELECT @dynamic_sql = @dynamic_sql + N'SELECT CAST([' + c.name + N'] AS NVARCHAR(100)) AS person_name FROM [' + s.name + N'].[' + t.name + N'] WITH (NOLOCK) WHERE [' + c.name + N'] IS NOT NULL UNION ALL ' FROM sys.columns c INNER JOIN sys.tables t ON c.object_id = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE c.name LIKE '%CreatedBy%' -- 和第一步的列匹配规则保持一致 AND t.is_ms_shipped = 0; -- 移除末尾多余的UNION ALL,套外层全局去重逻辑 SET @dynamic_sql = N' SELECT DISTINCT person_name FROM (' + -- 去掉最后一行多余的UNION ALL关键字 LEFT(@dynamic_sql, LEN(@dynamic_sql) - LEN('UNION ALL')) + N') AS source_data ORDER BY person_name;'; -- 执行最终查询 EXEC sp_executesql @dynamic_sql;
落地注意事项
- 方案为实时读取表内存储的列值,不受值随日期动态变化的影响,只要是历史写入的人员姓名值都会被纳入统计范围,无需针对不同日期的数据集单独拆分查询
- 针对超大型表的扫描,可以在拼接的查询片段中追加时间范围过滤条件(比如仅统计近1年写入的数据),减少全表扫描带来的实例性能压力
- 统一将列值转为
NVARCHAR(100)类型,可避免不同表的同名字段因数据长度、类型差异导致的动态SQL执行报错 - 只要列名符合匹配规则,无论该列存在于业务库schema、归档表schema、历史备份表schema中,都会被自动纳入扫描范围,完全满足不受表位置限制的需求
内容的提问来源于stack exchange,提问作者J.Contigo
相关产品推荐
相关产品推荐

