如何使用OPENQUERY访问另一个SQL Server

在项目中,经常会遇到一个数据库访问另一个数据库,【CNVFERPDB】为服务器名,【CE3】为库名

1 SELECT Dtl.* 

2 FROM CNVFERPDB. CE3.ce3.ZTLE0125 Dtl 

3 INNER JOIN CNVFERPDB.CE3.ce3.ZTLE0124 Mst 

4 ON Dtl.RECVSUPPNO = Mst.RECVSUPPNO AND Dtl.MANDT = Mst.MANDT 

5 WHERE Mst.MANDT = '100' and Dtl.BRANDCODE='MD'

上面的方式是通过服务器名和库名直接访问,这样有多次连接另一个服务器,执行速度会很慢

可以换做下面的形式,执行速度将得到提升:

 1 SELECT *  

 2 FROM OPENQUERY (CNVFERPDB  

 3     , 

 4     ' 

 5     SELECT Dtl.*  

 6     FROM    CE3.ce3.ZTLE0125 Dtl  

 7     INNER JOIN CE3.ce3.ZTLE0124 Mst  

 8     ON Dtl.RECVSUPPNO = Mst.RECVSUPPNO  AND Dtl.MANDT = Mst.MANDT  

 9     WHERE Mst.MANDT = ''100'' and Dtl.BRANDCODE=''MD''

10     '  

11 ) 

OPENQUERY ( linked_server ,'query' )
使用注意事项:
  linked_server 
    表示链接服务器名称的标识符。
  'query'

    在链接服务器中执行的查询字符串。 该字符串的最大长度为 8 KB。


补充
 1 declare @Day VARCHAR(10)=CONVERT(CHAR(8),DATEADD(DAY,-1,GETDATE()),112)

 2 

 3 --set @Day='20140605'

 4 

 5 IF EXISTS(select * from AppLog where Dates=@Day)

 6 return

 7 

 8 declare @sql VARCHAR(2000)='select * 

 9 INTO #temp

10 from openquery

11 ([CNSASPLOGDB01],

12 ''

13 select 

14 A.ProgramId

15 ,'''''+@Day+''''' AS Dates

16 ,COUNT(Duration) as Count

17 ,SUM(CAST(Duration AS DECIMAL(12,3)))/1000 AS SumTime

18 ,AVG(CAST(Duration AS DECIMAL(12,3)))/1000 as AvgTime

19 ,MAX(CAST(Duration AS DECIMAL(12,3)))/1000 as MaxTime

20 from 

21 (

22 select * from LogCSLK01.dbo.AppLog_'+@Day+' with(nolock)

23 union

24 select * from LogCSLK02.dbo.AppLog_'+@Day+' with(nolock)

25 union

26 select * from LogCSLK03.dbo.AppLog_'+@Day+' with(nolock)

27 ) A

28 group by A.ProgramId

29 ''

30 )

31 

32 insert into AppLog

33 select * 

34 from #temp

35 

36 drop table  #temp

37 '

38 --print @sql

39 

40 exec(@sql)

 

你可能感兴趣的:(SQL Server)