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

如何针对所有数据库执行检索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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:44