跨多个服务器运行SQL脚本

时间:2013-05-01 15:11:38

标签: sql sql-server-2008-r2

背景:

我有一个测试服务器(SQL Server 2008 R2),其中包含一个数据库,我在其中存储有关我的生产服务器(SQL Server 2008 R2和2012的混合)中其他数据库的信息。我有每月运行的多个脚本,它们从服务器上的每个数据库收集信息,例如VLF的数量。我一直在做的是在每个生产服务器上运行脚本,将结果复制到.txt文件,然后将.txt文件导入到我的测试服务器上的数据库中。

问题:

  1. 如何自动化我的脚本以在每个Production服务器上运行 没有我登录到每个生产服务器并运行每个脚本?

  2. 如何将收集的信息插入我的Test Server DB 无需复制/粘贴?

  3. 示例脚本:

    SET NOCOUNT ON;
    
    CREATE TABLE #to
    (
      ServerName varchar(20),
      CaptureDate DATETIME,
      DBName SYSNAME,
      FileCount INT
    );
    
    DECLARE @v INT;
    SELECT @v = CONVERT(INT, PARSENAME(CONVERT(VARCHAR(32), 
      SERVERPROPERTY('ProductVersion')), 4));
    
    DECLARE @sql NVARCHAR(MAX);
    
    SET @sql = N'CREATE TABLE #ti
      (
        ' + CASE WHEN @v >= 11 THEN 'RecoveryUnitId INT,' ELSE '' END + '    
        FileId int
        , FileSize nvarchar(255)
        , StartOffset nvarchar(255)
        , FSeqNo nvarchar(255)
        , Status int
        , Parity int
        , CreateLSN nvarchar(255)
    );';
    
    SELECT @sql = @sql + '
      INSERT #ti EXEC ' + QUOTENAME(name) 
        + '.sys.sp_executesql N''DBCC LOGINFO WITH NO_INFOMSGS'';
      INSERT INTO 
            #to(DBName, FileCount) SELECT ''' + name + ''', COUNT(*) FROM #ti;
      TRUNCATE TABLE #ti;'
    FROM sys.databases;
    
    EXEC sp_executesql @sql;
    
    SELECT @@ServerName,GETDATE(),DBName,FileCount 
    
    FROM #to
    
    ORDER BY DBName
    
    DROP TABLE #to;
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

  1. 在每个生产SQL Server上创建一个链接服务器到测试数据库

    此链接提供有关链接服务器的更多信息 http://msdn.microsoft.com/en-us/library/ff772782.aspx

  2. 创建一个运行SQL脚本的SQL Server作业,该脚本将数据插入测试服务器上的表中(通过链接服务器)