SQL Server 多服务器查询

Server表数据结构:
CREATE TABLE [dbo].[Sys_Server]
(
[UpdateTime] [datetime] NULL,
[IsDeleted] [bit] NOT NULL CONSTRAINT [DF__Sys_Serve__IsDel__267ABA7A] DEFAULT ((0)),
[ID] [uniqueidentifier] NOT NULL CONSTRAINT [DF__Sys_Server__ID__276EDEB3] DEFAULT (newsequentialid()),
[IsMain] [bit] NOT NULL,
[DataIP] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL,
[DataDBName] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL,
[DataUser] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL,
[DataPw] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL,
[DataDBType] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL,
[CreateDate] [datetime] NOT NULL CONSTRAINT [DF_Sys_Server_CreateDate] DEFAULT (getdate()),
[IsLocal] [bit] NOT NULL CONSTRAINT [DF__Sys_Serve__IsLoc__286302EC] DEFAULT ((0)),
[Seq] [int] NOT NULL CONSTRAINT [DF__Sys_Server__Seq__29572725] DEFAULT ((0)),
[SynTime] [datetime] NULL,
[ReceiveTime] [datetime] NULL,
[Synchronized] [bit] NULL CONSTRAINT [DF__Sys_Serve__Synch__29CC2871] DEFAULT ((0))
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Sys_Server] ADD CONSTRAINT [PK_Sys_Server] PRIMARY KEY CLUSTERED ([ID]) ON [PRIMARY]
GO
EXEC sp_addextendedproperty N'MSE_ObjectID', N'4e50a8a2-fc10-4ecf-89e9-ea99098f3cf3', 'SCHEMA', N'dbo', 'TABLE', N'Sys_Server', NULL, NULL
GO
View Code

转换函数:

 1 SET QUOTED_IDENTIFIER ON
 2 SET ANSI_NULLS ON
 3 GO
 4 CREATE FUNCTION [dbo].[ConvertSql]
 5     (
 6       @StrSql VARCHAR(MAX) ,
 7       @ServerID VARCHAR(55),
 8       @IsMainLoadAllSrv BIT
 9     )
10 RETURNS VARCHAR(MAX)
11 AS
12     BEGIN
13         DECLARE @NewLine CHAR,@Enter CHAR
14         SET @NewLine=CHAR(10)
15         SET @Enter=CHAR(13)
16     
17         DECLARE @Firsthand VARCHAR(MAX) ,
18             @ReturnSql VARCHAR(MAX),
19             @sql VARCHAR(MAX) ,
20             @Tmp VARCHAR(max),
21             @Seat1 INT,
22             @Seat2 INT,
23             @Seat3 INT
24       
25         SET @ReturnSql=''
26         SET @Firsthand=@StrSql
27         SET @Seat1=CHARINDEX('/*',@Firsthand)
28         WHILE @Seat1>0 BEGIN
29             SET @Seat2=CHARINDEX('*/',@Firsthand,@Seat1)
30             SET @Seat3=CHARINDEX('/*',@Firsthand,@Seat1+2)
31             IF @Seat3>0 AND @Seat3<@Seat2 BEGIN
32                 SET @Seat1=@Seat3
33                 continue
34             END 
35             SET @Tmp=SUBSTRING(@Firsthand,@Seat1,@Seat2-@Seat1+2)
36             SET @Firsthand=REPLACE(@Firsthand,@Tmp,' ')
37             SET @Seat1=CHARINDEX('/*',@Firsthand)
38         END
39         
40         SET @Seat1=CHARINDEX('--',@Firsthand)
41         WHILE @Seat1>0 BEGIN
42             SET @Seat2=CHARINDEX(@NewLine,@Firsthand,@Seat1)
43             IF @Seat2=0 BEGIN
44                 SET @Seat2=CHARINDEX(@Enter,@Firsthand,@Seat1)
45             END
46             IF @Seat2=0 BEGIN
47                 SET @Seat2=LEN(@Firsthand)
48             END
49             
50             SET @Tmp=SUBSTRING(@Firsthand,@Seat1,@Seat2-@Seat1+1)
51             SET @Firsthand=REPLACE(@Firsthand,@Tmp,' ')
52             SET @Seat1=CHARINDEX('--',@Firsthand)
53         END
54 
55           DECLARE @tb TABLE(ID UNIQUEIDENTIFIER PRIMARY KEY)
56           DECLARE @SID UNIQUEIDENTIFIER,
57           @IP VARCHAR(55),
58           @User VARCHAR(55),
59           @Pwd VARCHAR(55),
60           @DbName VARCHAR(200),
61           @IsMain BIT
62           
63           SELECT TOP 1 @SID=ID,@IP=DataIP,@User=DataUser,@Pwd=DataPw,@DbName=DataDBName,@IsMain=IsMain
64             FROM dbo.Sys_Server 
65             WHERE IsDeleted=0 AND ID = @ServerID 
66           WHILE (@@ROWCOUNT>0 ) BEGIN
67                 
68                 INSERT INTO @tb (ID)VALUES  (@SID)
69                 DECLARE @num INT
70                 SELECT @num=COUNT(1) FROM @tb
71                 
72                 SET @sql = REPLACE(@Firsthand, 'dbo.', @DbName + '.dbo.')    
73                 SET @sql = REPLACE(@sql, '''', '''''')    
74             
75                 SET @sql = @NewLine  + 'SELECT  * FROM    openrowset(''SQLOLEDB'',''' + @IP
76                   + ''';''' + @User + ''';''' + @Pwd + ''',''' + @NewLine + @sql + ''')'
77                 IF (@Num>1) BEGIN
78                     SET @ReturnSql = @ReturnSql + @NewLine + 'UNION ALL' + @NewLine
79                 END
80                 SET @ReturnSql =@ReturnSql+@sql
81                 IF(@IsMainLoadAllSrv=0 OR @IsMain=0) BREAK
82                 SELECT TOP 1 @SID=s.ID,@IP=s.DataIP,@User=s.DataUser,@Pwd=s.DataPw,@DbName=s.DataDBName 
83                     FROM dbo.Sys_Server s
84                     WHERE s.IsDeleted=0 AND NOT EXISTS(SELECT 1 FROM @tb WHERE ID=s.ID)
85                     ORDER BY s.Seq
86           END
87         RETURN @ReturnSql
88     END
89 
90 
91 GO
92 EXEC sp_addextendedproperty N'MSE_ObjectID', N'c6bfe6ab-d0df-491c-bee7-cb67cc2114cd', 'SCHEMA', N'dbo', 'FUNCTION', N'ConvertSql', NULL, NULL
93 GO
View Code

调用():

DECLARE @s NVARCHAR(MAX)
SET @s='
--查询语句
select ID,Code,Name from dbo.Sys_User
'
SELECT @s=dbo.ConvertSql(@s,'Server表中服务器的GuID','1,如果服务IsMain=1,加载所有服务器,否则查询单个服务器')
EXEC @s
View Code

 

ALTER PROCEDURE [dbo].[ConvertSelect] ( @sql NVARCHAR(MAX) )
AS
    BEGIN
        DECLARE @seat INT;
        SET @seat = PATINDEX('%select%', @sql) + 6;

        SET @sql = 'SELECT  (SELECT  DataDBName FROM dbo.Sys_Server WHERE IsLocal=1 AND IsDeleted=0) _DBName,'   + SUBSTRING(@sql, @seat, LEN(@sql) - @seat);
        SELECT  @sql = dbo.ConvertSql(@sql, ( SELECT  ID FROM dbo.Sys_Server  WHERE     IsMain = 1 AND IsDeleted = 0), 1);
        PRINT @sql;
        EXEC(@sql);
    END;

自动查询汇总12个服务器中的数据

posted @ 2015-11-25 15:10  wono  阅读(238)  评论(0)    收藏  举报