在多个数据库上执行相同的SQL查询

时间:2016-06-20 11:02:39

标签: sql sql-server

我正在尝试调整SQL查询以检查服务器上每个数据库中存在的某个字段中的值。

有100个单独的数据库,我想检查每个数据库的具体记录。

答案可能是使用如下所示的命令,但我很难适应它。

EXECUTE sp_MSForEachDB 
    'USE ?; SELECT DB_NAME()AS DBName, 
    COUNT(1)AS [Count] FROM CUSTOMERS'

我通过以下链接取得了更大的成功;

https://stackoverflow.com/a/18462734/3461845

我需要能够执行此查询:

SELECT [SettingName],[SettingValue]  FROM [HostSettings] Where [SettingName] = 'SMTPServer'

并且还为返回的每一行拉回数据库的名称;

DBName | SettingName | SettingValue

Database1 | SMTPServer | smtp.gmail.com

Database2 | SMTPServer | smtp.gmail.com

Database3 | SMTPServer | smtp.yahoo.com

非常感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:2)

DECLARE @T TABLE
([DbName] SYSNAME,
[SettingName] VARCHAR(255),
[SettingValue] VARCHAR(255));

INSERT INTO
@T
EXEC sp_MSForEachDB
'SELECT
    ''?'',
    [SettingName],
    [SettingValue]
FROM
    [?]..[HostSettings]
WHERE
    [SettingName] = ''SMTPServer''';

SELECT * FROM @T;

答案 1 :(得分:0)

您可以在SSMS中使用已注册的服务器。在所有数据库上运行相同的查询。

  1. 在SSMS中,转到查看

  2. 然后已注册的服务器

  3. 右键单击本地服务器组,然后新服务器组

  4. 键入组的任何名称

  5. 然后是您创建的群组名称,右键单击新服务器注册

  6. 服务器名称 Localhost (例如)

  7. 然后右键单击 Localhost 新查询。这将在所有数据库上运行所有相同的查询

答案 2 :(得分:0)

忽略下面。试试这个。

DECLARE @sql VARCHAR(8000)
DECLARE @string VARCHAR(100)= 'SMTPServer'
SET @sql = 'EXECUTE sp_MSForEachDB 
    ''USE ?; SELECT DB_NAME()AS DBName, 
        SettingName,
        SettingValue
    FROM HostSettings
    WHERE SettingName =''' + '''' + @string +'''''' + ''''

EXEC (@sql)