如何针对所有数据库执行检索AFFINITY列的SQL查询?
遍历所有SQL Server数据库检索指定列信息
没问题,我帮你把原查询调整为可以在所有数据库中执行的版本,同时保留你需要的筛选和排序逻辑。核心思路是用动态SQL遍历每个数据库,执行你原有的列检索逻辑,最后合并所有结果。
调整后的完整查询
DECLARE @DynamicSQL NVARCHAR(MAX) = N''; -- 遍历所有用户数据库(可根据需求修改过滤条件) SELECT @DynamicSQL += N' UNION ALL SELECT ''' + QUOTENAME(name) + ''' AS DB_NAME, T.NAME AS TABLE_NAME, MAX(C.NAME) AS COLUMN_NAME FROM ' + QUOTENAME(name) + '.SYS.tables T INNER JOIN ' + QUOTENAME(name) + '.SYS.columns C ON T.object_id = C.object_id WHERE C.name LIKE ''%AFFINITY%'' OR C.name = ''affinity'' GROUP BY T.NAME' FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb'); -- 排除系统数据库,如需包含可删除此行 -- 去掉开头多余的UNION ALL,并添加最终排序 SET @DynamicSQL = STUFF(@DynamicSQL, 1, 10, '') + N' ORDER BY TABLE_NAME'; -- 执行动态SQL EXEC sp_executesql @DynamicSQL;
关键说明
- 遍历数据库:通过
sys.databases获取所有数据库,用QUOTENAME处理数据库名,避免特殊字符或保留字导致的语法错误。 - 保留原逻辑:每个数据库内的查询逻辑和你原查询一致——筛选名称包含
AFFINITY或等于affinity的列,并用MAX(COLUMN_NAME)聚合(如果你的需求是显示表中所有符合条件的列,而不是只保留一个,去掉MAX()和GROUP BY即可)。 - 统一排序:最后对所有数据库的结果按表名统一排序。
注意事项
- 执行此查询需要足够的权限:至少要有
VIEW ANY DEFINITION权限,或者对每个目标数据库有访问sys.tables和sys.columns的权限。 - 如果需要包含系统数据库,删除
WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')这一行即可。 - 如果你的SQL Server版本支持
STRING_AGG,也可以用更简洁的方式拼接动态SQL,但上面的写法兼容性更好。
内容的提问来源于stack exchange,提问作者user9192401
相关产品推荐
相关产品推荐

