用于迭代服务器的 SQL Server 脚本第 2 部分
Posted
技术标签:
【中文标题】用于迭代服务器的 SQL Server 脚本第 2 部分【英文标题】:SQL Server Script to Iterate through servers Part 2 【发布时间】:2011-02-15 14:51:19 【问题描述】:我正在尝试创建一个脚本来从服务器中的多个数据库获取数据,然后我希望它继续到下一个服务器并执行相同的操作。我已经创建了一个脚本来处理一台服务器及其所有数据库。该脚本对所有数据库、所有服务器中的表都是相同的。
我的问题是,如何让脚本识别我链接到当前服务器的链接服务器并继续从这些服务器获取数据?是否存在某人可能知道的隐藏存储过程或命令?我基本上想通过我的所有服务器运行以下脚本。当它遍历一个服务器中的所有数据库时,我希望它继续到下一个服务器并执行相同的操作。我将把所有数据保存在一个表中。
下面是我的脚本,我想让脚本通过我目前已链接到我的一台服务器的 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
我应该添加另一个光标吗?这个脚本的一些东西:
select srvname from master..sysservers where srvname like 'sql%'
【问题讨论】:
如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ()很好地格式化和语法高亮它! 【参考方案1】:我只会将您的光标嵌套在链接服务器上运行的另一个光标中。在等于“SQL Server”的 srvproduct 字段中过滤来自 master..sysservers 的服务器列表。如果有什么是您不想将其放在 not in 子句中的列表。然后,修改您的内部光标以将服务器名称添加到查询中,为您提供一个由四部分组成的表名称。
【讨论】:
以上是关于用于迭代服务器的 SQL Server 脚本第 2 部分的主要内容,如果未能解决你的问题,请参考以下文章
sql 简单的SQL Server脚本,用于备份当前服务器中的所有数据库
sql 用于管理SQL Server重建和重组索引碎片的脚本