MSSQL服务器:从全库指定名称表中提取SMTP Server字段值
解决方案
你可以用下面的动态SQL脚本,在sp_MSforeachdb里嵌套动态查询,既筛选出目标表,又能提取指定字段的值,还会自动跳过没有SMTP Server字段的表:
EXEC sp_MSforeachdb ' USE [?] -- 先检查当前库是否有符合条件的表 IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ''%SMTP Mail Setup%'') BEGIN DECLARE @dynamicSql NVARCHAR(MAX) = '''' -- 拼接每个符合条件且存在目标字段的表的查询语句 SELECT @dynamicSql = @dynamicSql + ''SELECT ''''?'''' AS DB_Name, '''''' + TABLE_NAME + '''''' AS Table_Name, [SMTP Server] AS SMTP_Server_Value FROM [?].dbo.['' + TABLE_NAME + ''] UNION ALL '' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ''%SMTP Mail Setup%'' AND EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = INFORMATION_SCHEMA.TABLES.TABLE_NAME AND COLUMN_NAME = ''SMTP Server'' ) -- 移除末尾多余的UNION ALL并执行 IF LEN(@dynamicSql) > 0 BEGIN SET @dynamicSql = LEFT(@dynamicSql, LEN(@dynamicSql) - 10) EXEC sp_executesql @dynamicSql END END '
脚本说明
- 先在每个数据库中检查是否存在表名含
SMTP Mail Setup的表 - 对每个符合条件的表,额外验证是否存在
SMTP Server字段,避免因字段缺失报错 - 动态拼接查询语句,一次性返回所有符合条件的数据库名、表名和对应字段值
- 如果部分数据库你没有读取权限,脚本会跳过这些库(或返回权限错误,但不影响其他库的执行)
内容的提问来源于stack exchange,提问作者bruor
相关产品推荐
相关产品推荐

