【问题标题】:Perform same SQL query on multiple databases对多个数据库执行相同的 SQL 查询
【发布时间】:2016-06-20 11:02:38
【问题描述】:

我正在尝试调整 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

非常感谢任何帮助。

谢谢!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:
    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;
    

    【讨论】:

    • 感谢您的回复,恐怕我收到以下错误 Incorrect syntax near '-'。我有一个谷歌,它可能与空白有关,但我已经尝试删除我可以删除的内容,但它仍然无法正常工作。
    • 我认为这是因为我的表名中有连字符......现在只是想解决这个问题。
    【解决方案2】:

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

    1. 在 SSMS 中,转到查看

    2. 然后是注册服务器

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

    4. 为组输入任意名称

    5. 然后是你创建的组名,右键New Server Registration

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

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

    【讨论】:

    • 我已经尝试过了,但它不适用于我的场景。
    【解决方案3】:

    下面忽略。试试这个。

    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)
    

    【讨论】:

      【解决方案4】:
      declare @userdb_list table (name varchar(4000) not null);
      -- fill the db list with custom subset
      insert into @userdb_list
      select name from sys.databases --can add where condition to filter db names
      
      declare
      @curr_userdb varchar(300),
      @db_placeholder varchar(300),
      @final_db_exec_query varchar(max),
      @query varchar(max);
      set @query = '' --  <add ur query here> 
      
      set @db_placeholder = 'use {db}'; 
      set @curr_userdb = (select min(name) from @userdb_list);
      
      while @curr_userdb is not null
      begin
      set @final_db_exec_query = replace(@db_placeholder, '{db}', @curr_userdb +  '  ' + @query);
      exec (@final_db_exec_query);
      --print @final_db_exec_query
      set @curr_userdb = (select min(name) from @userdb_list where name > @curr_userdb);
      end
      GO
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多