用于迭代服务器的 SQL Server 脚本

Posted

技术标签:

【中文标题】用于迭代服务器的 SQL Server 脚本【英文标题】:SQL Server Script to Iterate through servers 【发布时间】:2011-02-10 16:52:50 【问题描述】:

我正在尝试创建一个脚本来从服务器中的多个数据库获取数据,然后我希望它继续到下一个服务器并执行相同的操作。我已经创建了一个脚本来处理一台服务器及其所有数据库。该脚本对于所有数据库、所有服务器中的表都是相同的。

我的问题是,如何让脚本识别我链接到当前服务器的链接服务器并继续从这些服务器获取数据?是否存在有人可能知道的隐藏存储过程或命令?

下面是我的脚本,我想让脚本通过我目前已链接到我的一台服务器的 5 台服务器运行:

SET NOCOUNT ON
DECLARE @DBNAME NVARCHAR(MAX)
DECLARE @DBNAME1 NVARCHAR(MAX)
DECLARE @varSQL NVARCHAR(MAX)

DROP TABLE TEMPIMGCOUNTERSERVER3 
CREATE TABLE TEMPIMGCOUNTERSERVER3 
(DBname NVARCHAR(MAX),
Images INT,
FileSize INT,
DBCreation DATETIME)

DECLARE DBNAME CURSOR FAST_FORWARD FOR
select name from sys.databases where [NAME] LIKE 'Z%' AND create_date between '2011-02-06' and '2011-02-12'
ORDER BY [create_date]

OPEN DBNAME

FETCH NEXT FROM DBNAME INTO @DBname
WHILE (@@FETCH_STATUS=0)
BEGIN

    Set @varSQL='INSERT INTO TEMPIMGCOUNTERSERVER3 (DBNAME, IMAGES, FileSize, DBCreation) 
    SELECT ''['+@DBNAME+']'', SUM(PGCOUNT), sum(filesize/1024/1024), sys.databases.CREATE_DATE
        FROM SYS.DATABASES, ['+@DBNAME+'].dbo.tbldoc WHERE created between ''2011-02-06'' and ''2011-02-12''
        and sys.databases.name='''+@DBNAME+''' 
        GROUP BY sys.databases.NAME, sys.databases.CREATE_DATE' 
    EXEC SP_EXECUTESQL @varSQL

    FETCH NEXT FROM DBNAME 
    INTO @DBNAME
    END

    CLOSE DBNAME
    DEALLOCATE DBNAME

    INSERT TEMPIMGCOUNTERSERVER3 (DBNAME, IMAGES, FILESIZE)  
    SELECT @@SERVERNAME + ' ' +'TOTAL IMAGES AND FILE SIZE', SUM(IMAGES), SUM(FILESIZE) FROM TEMPIMGCOUNTERSERVER3 

     SELECT DBNAME, IMAGES, FILESIZE, convert(VARCHAR(10), 
    DBCREATION, 101) AS DBCREATION FROM TEMPIMGCOUNTERSERVER3
    GROUP BY DBNAME, IMAGES, FILESIZE, convert(VARCHAR(10), DBCREATION, 101)
    HAVING SUM(IMAGES) is not null
    ORDER BY DBCREATION

【问题讨论】:

【参考方案1】:

您可以使用sp_linkedservers 获取链接服务器的列表。不幸的是,没有看到您的脚本,我不知道使用此列表在每个链接服务器上执行脚本是多么容易。

当然,在最坏的情况下,您始终可以将脚本构建为字符串并结合列表并使用 EXEC。

【讨论】:

【参考方案2】:

使用链接服务器可能是实现此目的的一种方法 - 但我想建议您看看提供类似功能的另一或两个工具 - 但从服务器的“外部”。

其中一个工具是SQL Deploy,它允许您选择一个脚本目录(或单个脚本),然后从您提供/配置的列表中针对任意数量的服务器部署该脚本/这些脚本。

Red-Gate 的 SQL Multi Script 有点相似 - 同样,您可以选择多个脚本并让它们在您定义的多个服务器上执行:

也许这些工具值得一看?

【讨论】:

以上是关于用于迭代服务器的 SQL Server 脚本的主要内容,如果未能解决你的问题,请参考以下文章

sql 简单的SQL Server脚本,用于备份当前服务器中的所有数据库

Linux下备份SQL Server的Shell脚本

用于 SQL Server 持续集成测试的备份/恢复数据库

怎么在sql server中执行脚本

sql 用于管理SQL Server重建和重组索引碎片的脚本

SQL server利用脚本添加链接服务器,可设置别名