我正在尝试创建一个脚本来从服务器中的多个数据库中获取数据,然后我希望它继续到下一个服务器并执行相同的操作。我已经创建了一个脚本来处理一个服务器及其所有数据库。所有数据库,所有服务器中的表都是相同的。
我的问题是,如何让脚本识别我链接到当前服务器的链接服务器并继续从这些服务器获取数据?是否存在某人可能知道的隐藏存储过程或命令?
下面是我的脚本,我想让脚本运行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
答案 0 :(得分:1)
您可以使用sp_linkedservers获取链接服务器的列表。不幸的是,如果没有看到你的脚本,我不知道使用这个列表在每个链接服务器上执行脚本是多么容易。
当然,在最坏的情况下,您总是可以将脚本与列表结合使用,并使用EXEC。
答案 1 :(得分:1)
使用链接服务器可能是一种方法 - 但我建议您查看另外一个或两个提供类似功能的工具 - 但是来自服务器的“外部”。
其中一个工具是SQL Deploy,它允许您选择脚本目录(或单个脚本),然后将该脚本/那些脚本部署到您提供的列表中的任意数量的服务器上/配置。
Red-Gate的SQL Multi Script有点相似 - 再次,您可以选择许多脚本并在您定义的许多服务器上执行这些脚本:
也许这些工具值得一看?