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
转换函数:
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
调用():
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
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个服务器中的数据

浙公网安备 33010602011771号