我正在尝试创建一个脚本来从服务器中的多个数据库中获取数据,然后我希望它继续到下一个服务器并执行相同的操作。我已经创建了一个脚本来处理一个服务器及其所有数据库。所有数据库,所有服务器中的表都是相同的脚本。
我的问题是,如何让脚本识别我链接到当前服务器的链接服务器并继续从这些服务器获取数据?是否存在某人可能知道的隐藏存储过程或命令?我基本上想通过我的所有服务器运行以下脚本。当它完成迭代一个服务器中的所有数据库时,我希望它继续到下一个服务器并执行相同的操作。我将把所有数据保存在表格中。
下面是我的脚本,我想让脚本运行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
我应该添加另一个游标吗?这个脚本的东西:
从master..sysservers中选择srvname,其中srvname如'sql%'
答案 0 :(得分:0)
我只是将光标嵌套在链接服务器上运行的另一个游标中。从srvproduct字段上的master..sysservers中筛选服务器列表,其中它等于“SQL Server”。如果那个列表中有任何内容你不想把它放在一个not in子句中。然后,修改内部游标以将服务器名称添加到查询中,为您提供四部分表名。